使 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 吗?