Mockito throw Exception

86,885

Solution 1

Change this:

thenThrow(DataAccessException.class)

to

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

Example:

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

You can only pass a Class reference when that Exception type has a No-Arg constructor, and the Spring exception does not have one.

Solution 2

Try

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

Solution 3

As stated by Jen S:

You can only pass a Class reference when that Exception type has a No-Arg constructor, and the Spring exception does not have one.

My solution was using Mockito:

Mockito.when(mockedObject.method(Mockito.anyString())).thenThrow(Mockito.mock(DataAccessException.class));
Share:
86,885

Related videos on Youtube

user2375298
Author by

user2375298

Updated on April 19, 2020

Comments

  • user2375298
    user2375298 about 4 years
    @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);
    

    I want to throw the Db exception for code coverage . its working if i give expected exception as : Exception.class but not for DataAccessException.class

    My method in original class is as following:

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

    i get the error

    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)
    

    and some error lines....

    Default test
    

    Tests run: 1, Failures: 1, Skips: 0

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

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

    • Dawood ibn Kareem
      Dawood ibn Kareem over 10 years
      Why are you expecting a DataAccessException when your class explicitly catches DataAccessException and converts it to something else?
  • user2375298
    user2375298 over 10 years
    it says DataAccessException cannot be instantiatied
  • Jen S.
    Jen S. over 10 years
    Yes, it says the class cannot be instantiated because it tries to use a no-arg constructor to make it. And the class has no such constructor.
  • wanovak
    wanovak about 8 years
    DataAccessException is an abstract class, so you can't instantiate it. You can use new DataRetrievalFailureException("reason") instead
  • Saurabh Patil
    Saurabh Patil about 6 years
    This is a more correct answer because when...thenThrow doesn't work with the methods that return void.
  • Udit Kumawat
    Udit Kumawat about 6 years
    it is still giving errors..."java.lang.AssertionError: Expected exception: org.springframework.dao.DataAccessException"...even I have used 'new DataAccessException("..."){}'
  • b15
    b15 about 5 years
    Worked for me, +1, but what is that { } doing?
  • PAA
    PAA almost 5 years
    @SaurabhPatil - How will you solve the issue where void method throws exception?
  • Saurabh Patil
    Saurabh Patil almost 5 years
    @PAA Do you mean to say you want void method to throw an exception during testing? Yes that's exactly the reason why this answer is better than the other one.
  • Prakruti Pathik
    Prakruti Pathik over 2 years
    very helpful and quick solution.. Thanks