Проблема заключается в том, что методы расширения в основном являются синтаксисом c сахара.
Я объясню на примере.
trait Foo
implicit class FooImplicit(foo: Foo) {
def bar: String = "bar
}
foo.bar
переводится как
new FooImplicit(foo).bar
Итак, насмешливо:
Mockito.when(foo.bar).thenReturn("bad")
становится:
Mockito.when(new FooImplicit(foo).bar).thenReturn("bad")
Обратите внимание, как foo.bar
лечится и в этом проблема.
Можно ли добиться того, что я хочу в текущей настройке?
Нет, я не думаю, что это возможно в текущей setup.
Если нет, то как мне выполнить рефакторинг моего кода
Единственный способ добиться этого - использовать неявные преобразования, а не неявные классы.
Я покажу пример, как этого можно достичь:
trait Foo {
def bar: String
}
object ImplicitFoo {
object implicits {
implicit fooToFooImplicit(foo: Foo): FooOps = new FooImplicit(foo)
class FooImplicit(foo: Foo) {
def bar: String = "bar"
}
}
}
и ваш тест
import org.scalatest.WordSpec
import org.mockito.MockitoSugar
class MySpec extends WordSpec with MockitoSugar {
"My mock" should {
"handle methods from implicit classes" in {
val fooOps = mock[FooImplicit]
implicit fooToOps(foo: Foo): FooImplicit = fooOps
val foo = mock[Foo]
when(foo.bar) thenReturn "bad" // works
}
}
}
В вашем производстве вам нужно получить неявный параметр форма Foo => FooImplicit
, поэтому при вызове этого метода из теста предоставляется фактическая неявная имитация ...
Если я тестирую в другом классе методы, доступные в неявном классе, он делает смысл тестировать readSomeTable и mainMethod внутри MyObject?
Я не думаю, что вам требуется тестировать readSomeTable и mainMethod внутри MyObject.B, но наоборот - true.
Дайте мне знать, если это поможет !!