Mockito抛出异常

时间:2014-03-04 12:54:25

标签: java exception spring-mvc testng mockito

@Test(expectedExceptions=DataAccessException.class)
public void testUpdateSubModuleOrderDateExceptionCheck() {
    //some code to initialize//
    UserSubModuleDao userSubModuleDao = mock(UserSubModuleDao.class);
    userModuleServiceImpl.setUserSubModuleDao(userSubModuleDao);
    UserSubModule userSubModule=new UserSubModule();
    UserSubModuleId userSubModuleId=new UserSubModuleId();
      when(userSubModuleDao.findById(any(UserSubModuleId.class),eq(false))).thenThrow(DataAccessException.class);

    userModuleServiceImpl.updateSubModuleOrder(data, moduleSysId, userId);

我想抛出代码覆盖率的Db异常。如果我将预期的例外情况指定为:Exception.class,而不是DataAccessException.class

,则其工作正常

原始课程中的方法如下:

public void updateSubModuleOrder(Long[] data, Long moduleSysId, Long userId) {
    try {

        for (int i = 0; i < data.length; i++) {
            SubModule subModule=new SubModule();
            subModule.setSubModuleId(data[i]);
            UserSubModuleId userSubModuleId = new UserSubModuleId();
            userSubModuleId.setSubModuleId(subModule);
            userSubModuleId.setUserId(userId);
            userSubModuleId.setUserModuleId(moduleSysId);
            UserSubModule userSubmodule = new UserSubModule();
            userSubmodule = userSubModuleDao.findById(userSubModuleId,
                    false);
catch (DataAccessException ewmsDataExp) {
        LOGGER.error(
                "Database Exception while updateSubModuleOrder because of {}",
                ewmsDataExp.getMessage());
        throw new EWMSServiceException(
                "Database Exception while updateSubModuleOrder"
                        + ewmsDataExp.getMessage());
    } catch (Exception exp) {
        LOGGER.error(
                "System Exception while updateSubModuleOrder because of {}",
                exp.getMessage());
        throw new EWMSServiceException(
                "Database Exception while updateSubModuleOrder"
                        + exp.getMessage());
    }*

我收到错误

FAILED: testUpdateSubModuleOrderDateExceptionCheck
org.testng.TestException: 
**Expected exception org.springframework.dao.DataAccessException but got    org.testng.TestException:** 
**Expected exception org.springframework.dao.DataAccessException but got         java.lang.InstantiationError: org.springframework.dao.DataAccessException**
    at org.testng.internal.Invoker.handleInvocationResults(Invoker.java:1497)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1245)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

和一些错误行。 ...

Default test

测试运行:1,失败:1,跳过:0

===============================================

===============================================

3 个答案:

答案 0 :(得分:34)

改变这个:

thenThrow(DataAccessException.class)

thenThrow(new DataAccessException("..."){ })

示例:

when(userSubModuleDao.findById(any(UserSubModuleId.class),eq(false))).thenThrow(new DataAccessException("..."){});

当Exception类型具有No-Arg构造函数时,您只能传递Class引用,而Spring异常没有。

答案 1 :(得分:13)

尝试

Mokito.doThrow(new Exception())。when(mockedObject).methodName(...);

答案 2 :(得分:2)

如仁恩(Jen S)所述:

仅当该Exception类型具有No-Arg构造函数且Spring异常不具有Class引用时,才可以传递Class引用。

我的解决方案是使用Mockito:

library(ggplot2)
df1 <- data.frame(x = 1 : 10, y = rnorm(10))
df2 <- data.frame(x = 1 : 10, y = runif(10))

g <- ggplot()
g <- g + geom_point(aes(x = x, y = y, color = 'color1'), 
                    data = df1, shape = 19, size = 2)
g <- g + geom_point(aes(x = x, y = y, color = 'color2'), 
                    data = df2, shape = 17, size = 3)
g + scale_colour_manual(breaks = c('color1', 'color2'), 
                        values = c('color1' = 'blue', 'color2' = 'red'),
                        guide = guide_legend(override.aes = list(shape = c(19, 17))))