我正在研究使用Spring Data Rest(2.0.1.RELEASE和Spring 4.0.2.RELEASE),并编写了一个简单的服务。我还使用DbUnit编写了一个简单的测试类(见下文)。
不幸的是,当我运行测试时,只有findAll方法通过。如果我注释掉findAll方法,那么findInvestigationalProductById会通过,而directLink会失败。如果我然后注释掉findInvestigationalProductById,那么directLink会通过。
这些方法都没有改变数据状态,所以我想知道是否有一些我忽略的配置会导致这种行为。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/com/perceptive/ctms/core/tests-context.xml"})
@WebAppConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DbUnitTestExecutionListener.class })
@DatabaseSetup("investigational-products-data.xml")
public class InvestigationalProductTests {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
MockitoAnnotations.initMocks(this);
}
@Test
public void findAll() throws Exception {
ResultActions resultActions = mockMvc.perform(get("/investProduct"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json"));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct", hasSize(3)));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct[0].investigationalProductCode", is("ACTIVE1")));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct[1].investigationalProductCode", is("ACTIVE2")));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct[2].investigationalProductCode", is("ACTIVE3")));
}
@Test
public void directLink() throws Exception {
ResultActions resultActions = mockMvc.perform(get("/investProduct/3"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json"));
System.out.println(resultActions);
resultActions.andExpect(jsonPath("$investigationalProductCode", is("ACTIVE3")));
}
@Test
public void findInvestigationalProductById() throws Exception {
ResultActions resultActions = mockMvc.perform(get("/investProduct/search/findInvestigationalProductById?id=3"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json"));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct", hasSize(1)));
resultActions.andExpect(jsonPath("$_embedded.investigationalProduct[0].developmentName", is("developmentName3")));
}
}
答案 0 :(得分:0)
这是对@DatabaseSetup
如何运作的误解。问题测试都是通过生成的id来处理引用数据。 API州:
测试注释,指示如何将数据库置于知识中 测试运行前的状态。此注释可以放在类上 或方法。当放置在类上时,在每个类之前应用设置 测试方法被执行。
在我看来有点含糊不清,但additional documentation说:
默认设置将执行CLEAN_INSERT操作,这意味着 DataSet XML中引用的表中的所有数据都将是 在插入新行之前删除。
即。测试不应该假设数据库(包括任何序列号)处于干净状态,只是数据是干净的。
添加以下代码
private static int currentOffset = 0;
private static final int TEST_OFFSET = 3;
/**
* After each test is run DatabaseSetup annotation deletes records
* and inserts fresh ones - this means we need to keep track of the
* current offset
*/
@After
public void offset() {
currentOffset += TEST_OFFSET;
}
(测试插入时偶尔会对currentOffset进行修改)可以跟踪当前的ID。
这似乎不太理想,但我不知道将数据库重置为真正干净状态的方法。