web-dev-qa-db-ja.com

モッキートは例外を投げる

@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

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

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

18
user2375298

これを変える:

thenThrow(DataAccessException.class)

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

例:

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

例外タイプにNo-Argコンストラクターがあり、Spring例外にコンストラクターがない場合にのみ、クラス参照を渡すことができます。

39
Jen S.

試してみる

Mockito.doThrow(new Exception()).when(mockedObject).methodName(...);
17
Shyam_coder