2017-09-04 132 views
0

我已經寫了JUnit測試:JUnit測試類故障

@Service 
public class EnterpriseCustomerVerificationService { 

@Autowired 
CreditCheckRepository creditCheckRepository; 

public String FTACheck(StandardInputHeader charterHeaderInputInfo, 
      Holder<StandardOutputHeader> charterHeaderOutputInfo, Long sys, Long prin, Long agent) 
      throws EnterpriseCustomerVerificationException { 

     String prepay = null; 
     List<String> prepays = null; 

     charterHeaderOutputInfo.value = new StandardOutputHeader(charterHeaderInputInfo); 
     prepays = creditCheckRepository.getCSGPrepay(sys.toString(), prin.toString(), agent.toString(), 
       charterHeaderInputInfo.getAuditUser()); 

     if (prepays != null && prepays.size() > 0) { 
      prepay = prepays.get(0); 
     } 

     return prepay; 
    } 
} 

CreditCheckRepository類

@Component 
public class CreditCheckRepository { 

    @Autowired 
    SPGetCSGPrepay spGetCSGPrepay; 

    public List<String> getCSGPrepay(String sys, String prin, String agent, String auditUser) { 
     return spGetCSGPrepay.execute(sys, prin, agent, auditUser); 
    } 
} 

測試方法

package com.charter.enterprise.credit.service; 

import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.List; 

import static org.junit.Assert.*; 

import javax.xml.ws.Holder; 

import org.junit.Before; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ExpectedException; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.Spy; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.springframework.test.util.ReflectionTestUtils; 

@RunWith(MockitoJUnitRunner.class) 
public class EnterpriseCustomerVerificationServiceTest { 

    @InjectMocks 
    EnterpriseCustomerVerificationService 
    enterpriseCustormerVerificationServiceMock; 


    @Mock 
    CreditCheckRepository creditCheckRepository; 

    @Rule 
    public ExpectedException thrown = ExpectedException.none(); 
    StandardInputHeader charterHeaderInputInfo; 
    Holder<StandardOutputHeader> charterHeaderOutputInfo; 

    @Before 
    public void setup() { 

     charterHeaderInputInfo = new StandardInputHeader(); 
     charterHeaderInputInfo.setAuditUser("test"); 
     charterHeaderInputInfo.setClientIp("127.0.0.1"); 
     charterHeaderOutputInfo = new Holder<StandardOutputHeader>(); 


     ReflectionTestUtils.setField(
       enterpriseCustormerVerificationServiceMock, 
       "creditCheckRepository", creditCheckRepository); 

    } 
    @Test 
     public void getFTACheckTest() { 

      String auditUser = "User"; 
      Long sys = 123L; 
      Long prin = 456L; 
      Long agent = 789L; 

      List<String> prepays = new ArrayList<String>(); 
      prepays.add("ABCDEF"); 

      Mockito.when(
        creditCheckRepository.getCSGPrepay("123", "456", "789", "User")) 
        .thenReturn(prepays); 
      // Mockito.when(spGetCSGPrepay.execute("123", "456","789", 
      // "User")).thenReturn(prepays); 
      String prepay = enterpriseCustormerVerificationServiceMock.FTACheck(
        charterHeaderInputInfo, charterHeaderOutputInfo, sys, prin, 
        agent); 
      assertNotNull(prepay); 
    } 
} 

我的問題是我總是無論何時我嘗試做斷言檢查:預付款對象。 另外我注入了Mocked爲EnterpriseCustomerVerificationService enterpriseCustormerVerificationServiceMock; 請問我的商業邏輯有問題嗎?

+0

你有沒有調試過它,並檢查你是否嘲笑正確的值? – Stultuske

+0

是的,我已經調試過它。但對象預付款在每次顯示爲空時都沒有獲得任何價值。 –

+1

Mockito.when( creditCheckRepository.getCSGPrepay(「123」,「456」,「789」,「User」)) .thenReturn(prepays);爲什麼你硬編碼的價值,使用匹配器,而不是像anyString,任何() –

回答

1

你做了一些糟糕!你的論點:

creditCheckRepository.getCSGPrepay("123", "456", "789", "User")) 

應該

creditCheckRepository.getCSGPrepay("123", "456", "789", "test")) 

作爲一個側面說明,你應該使用ArgumentMatchers(可能是Matchers,如果你使用的是舊版本),以避免這樣的問題:

Mockito.when(creditCheckRepository.getCSGPrepay(ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), 
    ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(prepays); 
+1

爲什麼'anyString()' - 在2017年只是'any()'?! – GhostCat

+0

@RC由於其現在的工作,如果我用匹配器是這樣的:Mockito.when( \t \t \t \t creditCheckRepository.getCSGPrepay(Matchers.anyString(),Matchers.anyString(),Matchers.anyString(),Matchers.anyString() )) \t \t \t \t .thenReturn(prepays); –