我有一个现有的应用程序,我正在尝试编写单元测试......没有真正的“服务”层。它是controller-> repository->数据库,端点是通过控制器上的注释定义的。我使用的是Spring Boot 1.3.8(不是1.4)。
我想要做的是模拟控制器以返回我可以验证的模拟集合。 INSTEAD正在发生的事情是应用程序正在被引导并且实际数据正在被播种,当我调用端点时,真正的应用程序数据正在返回。所以,我似乎有两个问题:我正在进行数据设置和配置我不想在单元测试中执行,其次,我的模拟控制器被忽略了。它们可能是相关的。任何帮助表示赞赏。感谢。
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Mock
private ApplicationController applicationController = new ApplicationController();
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void contextLoads() {}
@Test
public void testEndPoints() throws Exception {
Application testApp = TestUtils.generateApplication();
Mockito.when(applicationController.getApplications()).thenReturn(Arrays.asList(testApp));
log.info("Verifying applications endpoint is up and running.");
mockMvc.perform(get("/applications/")).andExpect(status().isOk())
.andDo(print())
.andExpect(content().contentType(TestUtils.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.[0].name",is("my_name")));
}
答案 0 :(得分:0)
通常在这样的情况下,模拟存储库被注入控制器,以便您可以在存储库上模拟方法,拥有所需的集合,在控制器内部执行一些处理,返回修改后的集合。然后,您的单元测试将验证此处理的集合是否符合预期。
类似的东西:
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@InjectMocks
private ApplicationController applicationController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
when(applicationRepository.findAllByIds(anyListOf(Long.class))
.thenReturn(<the collection you want to be processed by controller>);
}