收到JUnit测试的UnfinishedStubbingException

时间:2017-01-05 18:26:31

标签: java unit-testing junit mockito invocationtargetexception

您好我正在尝试使用Mockito测试方法并收到UnfinishedStubbingException。我是Mockito的新手,不确定我是否做了一件非常棒的事情:)

这些是我的存根

 @InjectMocks
Constants constants;

@Mock
PreGeneratedAccountRepository preGeneratedAccountRepository;

@InjectMocks
PopulateUnqiueAccountNumber populateUnqiueAccountNumber;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

和我的测试方法

 @Test
public void testCheckAvailableAccountNumbersForSuccess() throws Exception {

    populateUnqiueAccountNumber.setMinCount(2);
    populateUnqiueAccountNumber.setInsertRecordCount(2);

    long preGeneratedRowCount = 1;
    long preGeneratedAccountCount = 0;
    long accountNum = 8609024563l; 

    PreGeneratedAccount preGeneratedAccount = new PreGeneratedAccount();

    when(preGeneratedAccountRepository.countByAcctNumAvailableFlag(Constants.FALSE)).thenAnswer(new Answer<Long>() {
        @Override
        public Long answer(InvocationOnMock invocation) throws Throwable {              
            return preGeneratedRowCount;
        }
    });
    when(preGeneratedAccountRepository.countByAccountNum(accountNum)).thenAnswer(new Answer<Long>() {
        @Override
        public Long answer(InvocationOnMock invocation) throws Throwable {              
            return preGeneratedAccountCount;
        }
    });
    when(preGeneratedAccountRepository.saveAndFlush(preGeneratedAccount));

    // call testing method
    populateUnqiueAccountNumber.checkAvailableAccountNumbers();

    // Verify the mock calls
    verify(preGeneratedAccountRepository, times(1)).countByAcctNumAvailableFlag(Constants.FALSE);
    verify(preGeneratedAccountRepository, times(1)).countByAccountNum(accountNum);
    verify(preGeneratedAccountRepository, times(1)).saveAndFlush(preGeneratedAccount);

}

和我的服务方法

 @Scheduled(cron = "${app.config.cron.rate}")
public void checkAvailableAccountNumbers() {
    LOGGER.debug("Method execution started :: " + new Date());

    try {
        long rowCount = preGeneratedAccountRepository.countByAcctNumAvailableFlag(Constants.FALSE);
        LOGGER.debug("Available account numbers in Database" + rowCount);

        int totalRecordInserted = 0;

        if (rowCount < minCount) {
            do {
                int count = insertRecordCount - totalRecordInserted;
                LOGGER.debug("Number of Record need to insert::" + count);
                int recordInserted = insertAccountNumbers(count);
                totalRecordInserted = totalRecordInserted + recordInserted;
                LOGGER.debug("totalRecordInserted::" + totalRecordInserted);
            } while (totalRecordInserted < insertRecordCount);
        }
    }

    catch (DataAccessException e) {
        LOGGER.error("An exception was encountered when inserting account numbers", e);
        throw e;
    }
    LOGGER.debug("Method execution ended :: " + new Date());
}

我在服务中的这一行收到错误

preGeneratedAccountRepository.countByAcctNumAvailableFlag(Constants.FALSE);

例外

    Unfinished stubbing detected here:
-> at com.cardinalhealth.chh.batch.PopulateUnqiueAccountNumberTest.testCheckAvailableAccountNumbersForSuccess(PopulateUnqiueAccountNumberTest.java:80)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

你的问题就在这一行。

when(preGeneratedAccountRepository.saveAndFlush(preGeneratedAccount));

您尚未指定Mockito在调用此方法时要执行的操作。

另请注意,在您不需要时,您已经使用了Answer两次。您每次使用thenReturn时都可以使用Answer,例如,

when(preGeneratedAccountRepository.countByAcctNumAvailableFlag(Constants.FALSE)).thenReturn(pregeneratedAccountCount);