Spring Boot Controller测试-模拟存储库,但测试实际服务

时间:2018-07-14 17:44:36

标签: spring spring-boot integration-testing

我正在尝试在 Spring boot 2 中编写测试类,其中:

  • 我要测试控制器
  • 我想模拟一个仓库
  • 我想按原样注入服务(即对其进行嘲笑)

该类类似于:

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {
    @Autowired
    private MockMvc mvc;
    @MockBean
    private MyRepositoryInterface myRepository;
    @Autowired
    private MyService myService;
    // tests follow ...
}

MyService的(唯一)实现用@Service注释,并允许通过其@Autowired构造函数注入存储库:

@Service
public class MyActualService implements MyService {
    private MyRepository repo;
    @Autowired
    public MyActualService(MyRepository repo) {
        this.repo = repo;
    }
    // ...
} 

运行测试时,我得到一个NoSuchBeanDefinitionException,大致上说“没有MyService可用”。

我怀疑我可能需要特定的测试配置才能使用该服务,但是我对现有的在线文献完全感到困惑。

有指针吗?

1 个答案:

答案 0 :(得分:2)

docs所指出的,在咨询了jonsharpe(一开始我没有正确阅读)之后,我设法解决了一个可行的解决方案:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
    @Autowired
    private MockMvc mvc;
    @MockBean
    private MyRepositoryInterface myRepository;

    // no need to reference the service explicitly

    // ... tests follow
}

以上内容在加载完整的应用程序配置时检索服务,并且仅按照指示来模拟存储库。

我可能会写一个临时配置来更好地满足要求,但这已经可以“即开即用”地工作了。