我有一个基于Spring的Java应用程序,它使用服务。对于some reasons,我需要自动装配仅为单元测试而实现的服务。我希望这个自动化的类是一个Mockito模拟,这样我就可以将它传递给所有的Mockito方法(when()
等)。我应该扩展或实施一些Mockito课程吗?
E.g。
@Profile("test")
@Primary
@Service
public class MockAService implements AService {
public void callMethod(){}
}
然后在测试中我有
{
System.setProperty("spring.profiles.active", "test");
}
@Autowired AService aservice;
并且在我想要的测试方法中:
@Test
public void test(){
doNothing().when(aService).callMethod();
}
答案 0 :(得分:2)
只需使用@Spy并在@Before方法中调用MockitoAnnotations.initMocks。它将为您的注入服务创建一个间谍。
例如,我想测试MyService,它对MyDao有依赖性。我希望MyService使用我的模拟dao。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/com/stackoverflow/mokito/exemple/spring.xml"})
public class TestCase {
@Resource
@InjectMocks
private MyService service;
@Resource
@Spy
private MyDao dao;
public void setup() {
MockitoAnnotations.initMocks(this);
}
}
然而,你的春天环境现在已经很糟糕了#34;下一个测试类将使用相同的spring上下文,MyService仍将使用mock。所以不要忘记在@After重置模拟
答案 1 :(得分:0)
如果你不希望服务做任何事情,模拟甚至会比间谍更好。默认情况下,在模拟上调用函数将不会执行任何操作。 使用间谍,您必须显式调用doNothing()。
但是为什么要加载任何Spring上下文呢?难道你不能完全隔离所有服务并测试你的课程吗?