1

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

1 回答 1

0

这是对工作原理的误解@DatabaseSetup。问题测试都是通过生成的 id 来处理引用数据。API声明:

测试注释,指示如何在运行测试之前将数据库置于已知状态。这个注解可以放在一个类或方法上。当放置在类上时,会在执行每个测试方法之前应用设置。

在我看来这有点模棱两可,但附加文档指出:

默认情况下,安装程序将执行 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。

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

于 2014-04-28T07:39:57.490 回答