Mocked方法返回实际值而不是嘲讽的方法
问题描述:
我被要求在Android Studio上设置持续集成,所以我开始进行单元测试和嘲笑。Mocked方法返回实际值而不是嘲讽的方法
我觉得我错过了Mockito的基础和工作。我发现这样的例子在互联网上:
@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {
MainActivity classToTest = new MainActivity();
@Mock
ClassIDontWantToTest classToMock;
/**
* Examples found a lot of times on the Internet
* My method is not tested at all
* I think it doesn't make sense to test Mockito but our own methods
* @throws Exception
*/
@Test
public void testMethodIDontWantToTest() throws Exception {
when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result");
assertTrue(classToMock.methodIDontWantToTest().equals("Mocked result"));
}
}
这是我的代码:
public class MainActivity extends AppCompatActivity {
ClassIDontWantToTest classIWantToMock = new ClassIDontWantToTest();
/**
* Actual Method I want to test
* @return Return value
*/
public String methodIWantToTestButReturnsUnspectedValue() {
// (...) Code to test
return classIWantToMock.methodIDontWantToTest();
}
}
public class ClassIDontWantToTest {
public String methodIDontWantToTest() {
return "Actual result";
}
}
这是我的理解它必须做到:
@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {
MainActivity classToTest = new MainActivity();
@Mock
ClassIDontWantToTest classToMock;
/**
* Test I want to do and I think it makes sense, but it doesn't work
* @throws Exception
*/
@Test
public void testMethodIWantToTest() throws Exception {
when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result");
assertTrue(classToTest.methodIWantToTestButReturnsUnspectedValue().equals("Mocked result"));
}
}
显然有一些我不明白,但我不知道它是什么。 请问有谁能告诉我我哪里错了?
非常感谢!
答
你的模拟对象是没有设置正确,意味着你的MainActivity classToTest = new MainActivity();
类未与ClassIDontWantToTest classToMock;
注入要做到这一点,你需要这样的:
@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {
@InjectMocks
MainActivity classToTest;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Mock
ClassIDontWantToTest classToMock;
@Test
public void testMethodIWantToTest() throws Exception {
when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result");
String expected = classToTest.methodIWantToTestButReturnsUnspectedValue();
assertEquals(expected, "Mocked result");
}
}
答
尤里卡! 正如David Wallace所说,我必须在classToTest
的声明上注释@InjectMocks
。
现在我的测试工作正常,它是有道理的。非常感谢你!
@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {
@Mock
ClassIDontWantToTest classToMock;
@InjectMocks
MainActivity classToTest;
////////// Test that makes sense and works fine
@Test
public void testMethodIWantToTest() throws Exception {
when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result");
assertTrue(classToTest.methodIWantToTest().equals("Mocked result"));
}
}
//////////////// Class to mock
public class ClassIDontWantToTest {
public String methodIDontWantToTest() {
return "Actual result";
}
}
////////////// Class to be tested
public class MainActivity extends AppCompatActivity {
ClassIDontWantToTest classIWantToMock = new ClassIDontWantToTest();
//////////// Actual Method I want to test
public String methodIWantToTest() {
// (...) Code to test
return classIWantToMock.methodIDontWantToTest();
}
}
+0
然后你应该把这个答案标记为“接受”(或kuhajeyan的一个,这基本上是一样的)。 –
这是单元测试(在JVM中)还是仪器测试(在模拟器中)?此外,'ClassIDontWantToTest'和'methodIDontWantToTest'都是公共的和非最终的,对吗? –
据我所见,你还没有将你的模拟对象注入到你正在测试的类中。我的首选方法是向要测试的类中添加第二个构造函数,在其中传入“classIWantToMock”的值 - 然后测试已使用第二个构造函数实例化的对象。如果你不能在类中添加第二个构造函数,那么另一种方法是在测试中的'classToTest'声明中放置@InjectMocks注释 - 但有时可能会更加轻松。 –