簡體   English   中英

驗證不在 Mockito 中執行

[英]verify does not execute in Mockito

我得到錯誤:

Wanted but not invoked:
iReimbursementDAO.update(
    Reimbursement{id=2, status=Pending, author=User{id=1, username='genericEmployee1', password='genericPassword', f_name null', l_name null', email null', role=Employee}, resolver=null, amount=150.0, description null,creation null, resolution null, receipt null}
);
-> at Test.testProcessPassesWhenUserIsFinanceManagerAndReimbursementExistsAndUpdateSuccessful(ReimbursementServiceTest.java:69)

實際上,與此模擬的交互為零。 我按照上一篇文章的回答中的步驟操作,並讓我的測試成功用於不同的 class。 現在我在第二個 class 中嘗試了相同的步驟,如下所示,測試在一個地方失敗。

public class ReimbursementServiceTest {

    private static IReimursementService reimbursementService;
    private static IReimbursementDAO reimbursementDAO;
    
    private Reimbursement REIMBURSEMENT_TO_PROCESS;
    private Reimbursement GENERIC_REIMBURSEMENT_1;
    private Optional<Reimbursement> 
      GENERIC_REIMBURSEMENT_2;
    private List<Reimbursement> GENERIC_ALL_PENDING_REIMBURSEMENTS;
    private User GENERIC_EMPLOYEE_1;
    private User GENERIC_FINANCE_MANAGER_1;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        
        reimbursementDAO = mock(IReimbursementDAO.class);
        reimbursementService = new ReimbursementService(reimbursementDAO);
    }
    
    @Before
    public void setUp() throws Exception {
        GENERIC_EMPLOYEE_1 = new User(1, "genericEmployee1", "genericPassword", Role.EMPLOYEE);
        GENERIC_FINANCE_MANAGER_1 = new User(1, "genericManager1", "genericPassword",                 Role.FINANCE_MANAGER);
        
        REIMBURSEMENT_TO_PROCESS = new Reimbursement(2, Status.PENDING, GENERIC_EMPLOYEE_1, null,                150.00);
        
        GENERIC_REIMBURSEMENT_1 = new Reimbursement(1, Status.PENDING, GENERIC_EMPLOYEE_1, null, 100.00);
        GENERIC_REIMBURSEMENT_2 = Optional.ofNullable(new Reimbursement(2, Status.APPROVED,                               GENERIC_EMPLOYEE_1,   GENERIC_FINANCE_MANAGER_1, 150.00));
        
        GENERIC_ALL_PENDING_REIMBURSEMENTS = new ArrayList<Reimbursement>();
        GENERIC_ALL_PENDING_REIMBURSEMENTS.add(GENERIC_REIMBURSEMENT_1);
    }
    
    @Test
    public void testProcessPassesWhenUserIsFinanceManagerAndReimbursementExistsAndUpdateSuccessful()
    throws Exception{
        
        when(reimbursementDAO.getById(anyInt())).thenReturn(Optional.of(GENERIC_REIMBURSEMENT_1));
        when(reimbursementDAO.update(any())).thenReturn(GENERIC_REIMBURSEMENT_2);
        
        assertEquals(GENERIC_REIMBURSEMENT_2,
                reimbursementService.process(REIMBURSEMENT_TO_PROCESS, Status.APPROVED, 
                        
                        GENERIC_FINANCE_MANAGER_1));
        
        verify(reimbursementDAO).getById(REIMBURSEMENT_TO_PROCESS.getId());
        verify(reimbursementDAO).update(REIMBURSEMENT_TO_PROCESS);
        
    }
    
    @Test
    public void testGetReimbursementByStatusPassesWhenReimbursementsAreSuccessfullyReturned() {
        when(reimbursementDAO.getByStatus(any())).thenReturn(GENERIC_ALL_PENDING_REIMBURSEMENTS);
        
        assertEquals(GENERIC_ALL_PENDING_REIMBURSEMENTS, 
                reimbursementService.getReimbursementsByStatus(Status.PENDING));
        
        verify(reimbursementDAO).getByStatus(Status.PENDING);
    }
    }

   public class ReimbursementService implements 
    IReimursementService {
    private final IReimbursementDAO reimbDao;

    public ReimbursementService() {
        this(new ReimbursementDAO());
      }   
      public ReimbursementService(IReimbursementDAO userDAO2) {
        this.reimbDao = userDAO2;
       }
        
     @Override
     public Optional<Reimbursement> process(Reimbursement 
     unprocessedReimbursement,
            Status finalStatus, User resolver) throws Exception{
     if (!resolver.getRole().equals(Role.FINANCE_MANAGER)) {
               throw new RegistrationUnsuccessfulException(" be 
     Finance Manager ");}
    
     if(unprocessedReimbursement.getId()==0)
           {     throw new Exception(" reimbursement not found"); }
               
           
    if(unprocessedReimbursement.getStatus().equals(Status.PENDING))
        {
         Optional<Reimbursement> reimb=   
      this.reimbDao.update(unprocessedReimbursement);
               if(reimb.isPresent())  
               { return reimb; }
               else { throw new Exception("unsuccessful update");}
           }
           
            return Optional.ofNullable(null);       
       }
    @Override
    public List<Reimbursement> getReimbursementsByStatus(Status 
    status) {       
    return    reimbDao.getByStatus(status);
    }
    @Override
    public Optional<Reimbursement> getById(int id) {
        
        return reimbDao.getById(id);
    }
    }

您被告知錯誤是什么:想要但未調用 - 您想要調用dao.update ,但您沒有調用它。 “實際上,與這個模擬的互動為零。” 確切地說,那么您為什么要驗證是否調用了更新?

從測試中刪除它verify(reimbursementDAO).update(REIMBURSEMENT_TO_PROCESS);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM