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

Java 重复记录数据库异常的JUnit测试,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我需要测试我的数据库,当我在有约束的特定列中插入重复值时,它会触发异常。你能告诉我如何模拟第二次相同的呼叫和火灾异常吗 这是我的代码,但不起作用: @RunWith(MockitoJUnitRunner.class) public class SomeTestClass { @InjectMocks private FooService service = new FooServiceImpl(); @Test(expected = DataIntegrityViol

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

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

@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);
}

我做错了什么?谢谢。

我不确定您是想测试实际的数据库还是只需要模拟DB调用。如果您只是想测试服务类,最好使用模拟第二条语句

doThrow(ExpectedException).when(mockedObject).methodReturningVoid(...);
另外,如果您使用的是spring,那么只需使用
@injectmock
并使用
@mock
模拟受尊重类的依赖项

对于连续呼叫,您可以使用:

Mockito.when(repo.findOne(Matchers.anyString())).thenReturn(yourObject).thenThrow(EXCEPTION_OBJ)
我需要测试我的数据库,当我在 我有约束的特定列,它会引发异常

要执行一个断言来检查数据库约束是否存在并执行其工作,您应该使用内存中的数据库执行一个没有模拟的测试

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); 
    }
}

当然,您必须将测试上下文配置为使用内存中的数据库,而不是真正的数据库。

您应该展示FooService实现。请注意,您在这里并没有模拟任何内容。@davidxxx我编辑了这个问题。我测试了在我的服务中将有来自数据库的FireException,因为在表中,我对一列有唯一的约束。所以,当我第一次用某个对象调用服务时,它通过了,但第二次将抛出错误。但我如何在mock中用相同的参数模拟第二次调用呢?您是如何真正执行测试用例的?您的应用程序中是否有嵌入式服务器?任何testNg框架?我编辑了我的答案。因此调用应该返回到一个对象中,随后的调用将导致一个异常。事实上,如果他想测试一个依赖于异常的行为,这是有意义的。但是,当他想断言单元测试中抛出了
DataIntegrityViolationException
时,我想知道单元测试与Mockito的相关性。