Jus*_*ber 10 java unit-testing mocking mockito
我有这个类,并希望创建一个模拟返回并验证返回值"50":
QAService.java:
@Path("/QAService")
public class QAService {
@GET()
//@Path("/")
@Produces("text/plain")
public String getServiceInfo() {
return "50";
}
Run Code Online (Sandbox Code Playgroud)
我对定义模拟的理解是我可以创建一个实现类的假对象和模拟函数,但是我可以测试接口.
我仍然在创建这个测试来测试没有接口的模拟.我该如何验证呢?:
QAServiceTest.java:
public class QAServiceTest {
@Test
public void getserviceTest () {
QAService qasmock = mock(QAService.class);
when(qasmock.getServiceInfo()).thenReturn("50");
String expected = "50";
assertEquals(expected, qasmock.getServiceInfo());
}
}
Run Code Online (Sandbox Code Playgroud)
Jef*_*ica 17
让我们直接得到几个定义,首先:
一个单元测试是你写的,以确保自己开发的系统正常运作的代码简短一点.单元测试通常在框架中创建JUnit,但不需要.例如,单元测试会assertEquals(5, calculator.add(2, 3)).
甲模拟是真实的系统,其通常在单元测试中使用的模仿.嘲笑经常在像框架中创建Mockito或EasyMock,但并不需要如此.模拟是一种"测试双重"形式 - 用于替代实际系统的代码的通用术语,用于测试目的 - 而Martin Fowler在一篇名为"Mocks Are not Stubs"的文章中更准确地定义了它们.
在编写单元测试时,您正在尝试测试单个单元,通常称为被测系统或简称SUT.每个测试可能会有一个不同的系统正在测试中,重点是您在测试中测试的代码是您真实的实际代码,而不是任何类型的模拟或虚假实现.
在复杂的应用程序中,您的类可能需要与可能编写或未编写或编写的其他类协作,这些类通常称为依赖项.任何给定的类或系统可能都有自己的依赖项,并且可能是其他系统的依赖项.模拟框架有助于模拟这些依赖项,而不是模拟被测系统.
对于您的示例,QAService是您正在编写的主类(被测系统),QAServiceTest是该系统的单元测试.不需要嘲笑.
假设QAService依赖于另一个尚未编写的类,称为"StorageService".在编写QAService测试之前,您不一定要等待StorageService工作,因此不使用真正的StorageService而是使用模拟.同样,在名为QAServiceTest 的单元测试中,您使用真正的 QAService并模拟其依赖 StorageService.
即使您没有编写StorageService,您也可能对QAService如何使用该类有所期待.也许你知道,当你打电话时storageService.store(qaRecord),它应该返回一个数字ID 101.即使没有代码工作,你也可以创建一个Mockito mockStorageService,并准备如下:
when(mockStorageService.store(expectedQARecord)).thenReturn(101);
Run Code Online (Sandbox Code Playgroud)
现在让我们说在测试结束时,您要确保您正在测试的QAService方法绝对会调用storageService.delete(101).Mockito mockStorageService会像这样检查:
verify(mockStorageService).delete(101);
Run Code Online (Sandbox Code Playgroud)
通常没有必要验证您使用的语句when,因为测试不太可能成功,除非被测系统正确调用mock以获得返回值(此处为101).
现在让我们说你已经编写了另一个名为QAApplication的代码块,你正在一个名为QAApplicationTest的单元测试中测试,它依赖于QAService.您可能没有完成或测试QAService,并且使用真正的QAService需要StorageService,因此您在单元测试中使用模拟 QAService和真正的 QAApplication,称为QAApplicationTest.
所以,总结一下,一个模拟的作品中的单元测试嘲笑依赖的的测试系统.在您的情况下,QAServiceTest不需要模拟QAService,但可能用于模拟QAService的依赖项.如果你确实需要一个模拟QAService,那么在测试另一个QAService本身是依赖的类时你需要它.
Sot*_*lis 11
Junit只会运行带注释的方法@Test,所以添加它
@Test
public void getserviceTest () {
QAService qasmock = mock(QAService.class);
when(qasmock.getServiceInfo()).thenReturn("50");
String expected = "50";
assertEquals(expected, qasmock.getServiceInfo());
}
Run Code Online (Sandbox Code Playgroud)
此外,你应该verify()确实发生了你的模拟期望.
verify(qasmock, times(1)).getServiceInfo();
Run Code Online (Sandbox Code Playgroud)
请注意,您似乎想要测试QAService,但实际上您并没有这样做.你只是在测试一个模拟器.那不是一回事.
QAService自己创建对象并使用它.
| 归档时间: |
|
| 查看次数: |
42477 次 |
| 最近记录: |