当模拟注入到控制器中的服务时,服务方法应该返回一个模拟对象,如下所示:
public class EmptyInterventionServiceMock implements InterventionService {
@Override
public Intervention findByInvoiceNumber(String invoiceNumber, String language) {
return mockedIntervention(invoiceNumber, language);
}
protected Intervention mockedIntervention(String invoiceNumber, String language) {
return mock(Intervention.class);
}
}是否可以模拟上述模拟对象(Intervention)返回的一些值,以测试它们应该出现在生成的JSON模板中吗?
例如,取决于Intervention是否有spare parts、services、states (它们都只是其他对象的集合)等。如果有,JSON应该包含相应的键:services: [{....}]、states: [{}]等。
如果在测试中获得模拟对象并存根它的返回值,那就太好了。目前,我认为实现这一目标的唯一方法是创建一个单独的Mock服务类,并将其注入到测试类中,如下所示:
public class InterventionsControllerSpec extends ControllerSpec {
@Before
public void before() {
Injector injector = injector().bind(InterventionService.class).to(BaseInterventionServiceMock.class).create();
}在BaseInterventionServiceMock只扩展EmptyInterventionServiceMock和存根的地方,一些方法通过覆盖它的mockedIntervention方法来返回值:
public class BaseInterventionServiceMock extends EmptyInterventionServiceMock {
@Override
protected Intervention mockedIntervention(String invoiceNumber, String language) {
Intervention intervention = mock(Intervention.class);
when(intervention.getString("ITV_DOCUMENT_NUMBER")).thenReturn("123");
when(intervention.getString("ITV_INVOICE")).thenReturn(invoiceNumber);
...
etc.由于它离理想还很远,我想知道是否有DRYer方法可以做到这一点?
谢谢。
发布于 2018-09-27 23:54:12
你不会错过任何东西。你的假设是正确的。创建服务的mock子类是我们进行测试的方式。如果你想要一种更优雅的方式,你可以提交一个建议供考虑:https://github.com/javalite/activeweb/issues供考虑。
https://stackoverflow.com/questions/52538647
复制相似问题