使 class 成为 Mockito 模拟而不调用模拟
Make a class to be a Mockito mock without calling mock
我有一个基于 Spring 使用服务的 Java 应用程序。对于 ,我需要自动装配一个仅为了单元测试而实现的服务。我希望这个自动装配的 class 成为 Mockito 模拟,这样我就可以将它传递给所有 Mockito 方法(when()
,等等)。我应该扩展还是实现一些 Mockito class?
例如
@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();
}
只需使用 @Spy 并在你的@Before 方法中调用 MockitoAnnotations.initMocks。它将为您注入的服务创建一个间谍。
例如我想测试 MyService 并且它依赖于 MyDao。我希望 MyService 使用我的模拟 dao。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/com/Whosebug/mokito/exemple/spring.xml"})
public class TestCase {
@Resource
@InjectMocks
private MyService service;
@Resource
@Spy
private MyDao dao;
public void setup() {
MockitoAnnotations.initMocks(this);
}
}
但是您的 spring 上下文现在是 "dirty"。下一个测试 class 将使用相同的 spring 上下文,而 MyService 仍将使用模拟。所以不要忘记在 @After
中重置模拟
如果您不想让服务做任何事情,模拟甚至比间谍更好。默认情况下,调用 mock 上的函数不会执行任何操作。
对于间谍,您必须显式调用 doNothing()。
但是你为什么要加载任何 Spring 上下文呢?您不能模拟所有服务并在完全隔离的情况下测试您的 class 吗?
我有一个基于 Spring 使用服务的 Java 应用程序。对于 when()
,等等)。我应该扩展还是实现一些 Mockito class?
例如
@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();
}
只需使用 @Spy 并在你的@Before 方法中调用 MockitoAnnotations.initMocks。它将为您注入的服务创建一个间谍。
例如我想测试 MyService 并且它依赖于 MyDao。我希望 MyService 使用我的模拟 dao。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/com/Whosebug/mokito/exemple/spring.xml"})
public class TestCase {
@Resource
@InjectMocks
private MyService service;
@Resource
@Spy
private MyDao dao;
public void setup() {
MockitoAnnotations.initMocks(this);
}
}
但是您的 spring 上下文现在是 "dirty"。下一个测试 class 将使用相同的 spring 上下文,而 MyService 仍将使用模拟。所以不要忘记在 @After
中重置模拟如果您不想让服务做任何事情,模拟甚至比间谍更好。默认情况下,调用 mock 上的函数不会执行任何操作。 对于间谍,您必须显式调用 doNothing()。
但是你为什么要加载任何 Spring 上下文呢?您不能模拟所有服务并在完全隔离的情况下测试您的 class 吗?