use*_*719 28 java unit-testing mockito
我有界面
Interface MyInterface {
myMethodToBeVerified (String, String);
}
Run Code Online (Sandbox Code Playgroud)
并且接口的实现是
class MyClassToBeTested implements MyInterface {
myMethodToBeVerified(String, String) {
…….
}
}
Run Code Online (Sandbox Code Playgroud)
我有另一堂课
class MyClass {
MyInterface myObj = new MyClassToBeTested();
public void abc(){
myObj.myMethodToBeVerified (new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)
}
我正在尝试为MyClass编写JUnit.我已经做好了
class MyClassTest {
MyClass myClass = new MyClass();
@Mock
MyInterface myInterface;
testAbc(){
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
}
Run Code Online (Sandbox Code Playgroud)
但是我想得到 mockito但是没有被调用,实际上在验证调用时没有与这个模拟器进行零交互.
谁能建议一些解决方案.
Jk1*_*Jk1 15
你需要在你正在测试的类中注入mock.此刻,您正在与真实对象进行交互,而不是与模拟对象进行交互.您可以通过以下方式修复代码:
void testAbc(){
myClass.myObj = myInteface;
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)
虽然将所有初始化代码提取到@Before是一个更明智的选择
@Before
void setUp(){
myClass = new myClass();
myClass.myObj = myInteface;
}
@Test
void testAbc(){
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)
@Jk1 的回答很好,但 Mockito 还允许使用注释进行更简洁的注入:
@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too
@Mock MyInterface myInterface
Run Code Online (Sandbox Code Playgroud)
但是无论您使用哪种方法,都不会处理注释(甚至不是您的@Mock),除非您以某种方式调用静态MockitoAnnotation.initMocks()或使用@RunWith(MockitoJUnitRunner.class).