SCALA_VERTICALS Telegram 41
Обновление scalamock с 5.2.0 до 6.0.0

Привет! Это Женя Веретенников, я отвечаю за devtools для скалистов. Мы недавно обновили scalamock в нашем монорепозитории и сделали шажок к Scala 3 :)

Для тех, кто ещё не обновлялся — рассказываем про важный нюанс обновления.

В новой версии инстанс MockFactory обязан быть инстансом TestSuite. То есть нужно подмешивать MockFactory в класс теста, а не куда-либо ещё.

Например, такая конструкция больше не компилируется:


trait Mocking extends MockFactory {
val myMock = mock[MyService]
}

class MyServiceSpec extends AnyWordSpec {
"MyService" should {
"do something" in new Mocking { /* ... */ }
}
}


Эту конструкцию использовали, чтобы создавать отдельные моки под каждый тест.

Изменение API сделано не просто так. Чтобы scalamock проверял в конце теста, вызваны ли моки, как ожидалось, нужно подмешивать MockFactory именно в класс теста. Например, этот тест не падает, несмотря на очевидное отсутствие вызова f(42):


class NoMockFactorySpec extends AnyWordSpecLike {

trait Service {
def f(x: Int): String
}

"blabla" should {
"blabla" in new MockFactory {
val service = mock[Service]
(service.f _).expects(42).returning("42")
}
}
}


На версии scalamock 6.0.0 этот код не компилируется.

Корректно создать по моку на каждый тест можно с помощью OneInstancePerTest. Избавляться от fixture-трейтов типа Mocking, как в первом примере, необязательно. Достаточно завернуть его внутрь класса с тестом:



class MyServiceSpec extends AnyWordSpec with MockFactory with OneInstancePerTest {

trait Mocking {
val myMock = mock[MyService]
}

"MyService" should {
"do something" in new Mocking { /* ... */ }
}
}


В процессе обновления библиотеки мы заметили, что несколько тестов из-за этой проблемы уже давно были зелёными, но по факту сломанными, так как неверно проверяли моки. Часть тестов удалось пофиксить, на часть пришлось навесить @Ignore

Возможно, такие сломанные тесты найдутся при обновлении и у вас.

@scala_verticals



tgoop.com/scala_verticals/41
Create:
Last Update:

Обновление scalamock с 5.2.0 до 6.0.0

Привет! Это Женя Веретенников, я отвечаю за devtools для скалистов. Мы недавно обновили scalamock в нашем монорепозитории и сделали шажок к Scala 3 :)

Для тех, кто ещё не обновлялся — рассказываем про важный нюанс обновления.

В новой версии инстанс MockFactory обязан быть инстансом TestSuite. То есть нужно подмешивать MockFactory в класс теста, а не куда-либо ещё.

Например, такая конструкция больше не компилируется:


trait Mocking extends MockFactory {
val myMock = mock[MyService]
}

class MyServiceSpec extends AnyWordSpec {
"MyService" should {
"do something" in new Mocking { /* ... */ }
}
}


Эту конструкцию использовали, чтобы создавать отдельные моки под каждый тест.

Изменение API сделано не просто так. Чтобы scalamock проверял в конце теста, вызваны ли моки, как ожидалось, нужно подмешивать MockFactory именно в класс теста. Например, этот тест не падает, несмотря на очевидное отсутствие вызова f(42):


class NoMockFactorySpec extends AnyWordSpecLike {

trait Service {
def f(x: Int): String
}

"blabla" should {
"blabla" in new MockFactory {
val service = mock[Service]
(service.f _).expects(42).returning("42")
}
}
}


На версии scalamock 6.0.0 этот код не компилируется.

Корректно создать по моку на каждый тест можно с помощью OneInstancePerTest. Избавляться от fixture-трейтов типа Mocking, как в первом примере, необязательно. Достаточно завернуть его внутрь класса с тестом:



class MyServiceSpec extends AnyWordSpec with MockFactory with OneInstancePerTest {

trait Mocking {
val myMock = mock[MyService]
}

"MyService" should {
"do something" in new Mocking { /* ... */ }
}
}


В процессе обновления библиотеки мы заметили, что несколько тестов из-за этой проблемы уже давно были зелёными, но по факту сломанными, так как неверно проверяли моки. Часть тестов удалось пофиксить, на часть пришлось навесить @Ignore

Возможно, такие сломанные тесты найдутся при обновлении и у вас.

@scala_verticals

BY Scala-сообщество Вертикалей




Share with your friend now:
tgoop.com/scala_verticals/41

View MORE
Open in Telegram


Telegram News

Date: |

Telegram iOS app: In the “Chats” tab, click the new message icon in the right upper corner. Select “New Channel.” Today, we will address Telegram channels and how to use them for maximum benefit. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more. How to Create a Private or Public Channel on Telegram? Done! Now you’re the proud owner of a Telegram channel. The next step is to set up and customize your channel.
from us


Telegram Scala-сообщество Вертикалей
FROM American