JUnit测试重复记录的数据库异常

时间:2018-02-11 16:19:47

标签: java spring junit mockito

我需要测试我的数据库,当我在具有约束的特定列中插入重复值时,它会触发异常。你能告诉我如何模拟第二次同一个电话和火警异常吗?

这是我的代码,但不起作用:

@RunWith(MockitoJUnitRunner.class)
public class SomeTestClass {

    @InjectMocks
    private FooService service = new FooServiceImpl();

    @Test(expected = DataIntegrityViolationException.class)
    public void myTest() {
       // init Foo object here

       service.createFoo(myFoo); // here should pass

       service.createFoo(myFoo); // here shouldn't
    }
}

我无法显示原始的FooServiceImpl,但基本概念在这里:

@Transactional
public void createFoo(Foo foo) {
   MainFoo mainFoo = new MainFoo();

   SomeObj obj1 = objService.findOne(foo.getId());

   mainFoo.setObj(obj1);

   fooRepository.save(mainFoo);
}

我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

  

当我插入重复值时,我需要测试我的数据库   我有约束的特定列,它会触发异常。

要执行检查数据库约束是否存在并执行其工作的断言,您应该在不使用mock和内存数据库的情况下执行测试。

H2数据库对此有好处 在调用该方法之前,在内存数据库中添加Foo实体的记录。您可以使用EntityManager或您的服务执行此操作。 然后调用你的方法。

您的测试应该是什么样子的示例:

@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTestClass {

    private FooService service = new FooServiceImpl();

    @Autowired
    private EntityManager em;

    @Test(expected = DataIntegrityViolationException.class)
    public void myTest() {    
       Foo fooWithXxxValueInBarColumn= new ...();
       em.persist(fooWithXxxValueInBarColumn);
       Foo newFooWithSameXxxValueInBarColumn = new ...();
       service.createFoo(newFooWithSameXxxValueInBarColumn); 
    }
}

当然,您必须配置测试上下文以使用内存数据库而不是真实数据库。

答案 1 :(得分:0)

我不确定您是否要测试您的实际数据库,或者您只需要模拟数据库调用。如果您只是想测试您的服务类,请更好地模拟第二个语句。

doThrow(ExpectedException).when(mockedObject).methodReturningVoid(...);

此外,如果您使用的是Spring,那么您需要做的只是使用@InjectMocks并使用@Mock模拟受尊重类的依赖关系。

对于连续通话,您可以使用:

Mockito.when(repo.findOne(Matchers.anyString())).thenReturn(yourObject).thenThrow(EXCEPTION_OBJ)