【发布时间】:2016-09-06 09:32:15
【问题描述】:
我被要求在 Android Studio 上设置持续集成,因此我开始进行单元测试和模拟。
我觉得我误解了 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"));
}
}
显然有些东西我不明白,但我不知道它是什么。 谁能告诉我哪里错了?
非常感谢!
【问题讨论】:
-
这是单元测试(在 JVM 中)还是仪器测试(在模拟器中)?另外,
ClassIDontWantToTest和methodIDontWantToTest都是公开的和非最终的,对吧? -
据我所知,您还没有将模拟对象注入到您正在测试的类中。我首选的解决方法是向要测试的类添加第二个构造函数,在其中传入
classIWantToMock的值 - 然后测试已使用第二个构造函数实例化的对象。如果您无法向该类添加第二个构造函数,那么另一种方法是将 @InjectMocks 注释放在测试中的classToTest声明上 - 但有时可能会更不稳定。
标签: android unit-testing mockito