Spring Data Rest Unit测试选择性地通过

时间:2014-04-18 11:52:12

标签: java spring dbunit spring-data-rest spring-test-dbunit

我正在研究使用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")));
  }
}

1 个答案:

答案 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。

这似乎不太理想,但我不知道将数据库重置为真正干净状态的方法。