2014-10-31 3 views
10

Я пытаюсь реализовать Mockito протестировать конкретный метод, кроме .thenReturn (...), кажется, всегда будет возвращать нулевой объект, вместо того, что я намеревался:Mockito - thenReturn всегда возвращает нулевой объект

CUT:

public class TestClassFacade { 

    // injected via Spring 
    private InterfaceBP bpService; 

    public void setBpService(InterfaceBP bpService) { 

     this.bpService = bpService; 
    } 

    public TestVO getTestData(String testString) throws Exception { 

    BPRequestVO bpRequestVO = new BPRequestVO(); 

    bpRequestVO.setGroupNumber(testString) ; 
    bpRequestVO.setProductType("ALL") ;   
    bpRequestVO.setProfileType("Required - TEST") ; 

    IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO); //PROBLEM 

    if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) { 

     throw new Exception(); 

    } else { 

     TestVO testVO = new TestVO(); 
    } 

    return testVO; 
    } 

} 

Пружина Конфигурация:

<bean id="testClass" class="com.foo.TestClassFacade"> 

    <property name="bpService" ref="bpService" /> 

</bean> 

<bean id="bpService" class="class.cloud.BPService" /> 

Mockito Метод испытания: выход

@RunWith(MockitoJUnitRunner.class) 
public class BaseTest { 

    @Mock BPService mockBPService; 
    @InjectMocks TestClassFacade mockTestClassFacade; 

    private String testString = null; 
    private BPRequestVO someBPRequestVO = new BPRequestVO(); 
    private IBPServiceResponse invalidServiceResponse = new BPServiceResponse(); 

    @Test (expected = Exception.class) 
    public void getBPData_bobStatusCode_shouldThrowException() throws Exception { 

     invalidServiceResponse.setMessage("BOB"); 

     someBPRequestVO.setGroupNumber(null); 
     someBPRequestVO.setProductType("ALL"); 
     someBPRequestVO.setProfileType("Required - TEST"); 

     System.out.println("1: " + someBPRequestVO.getGroupNumber()); 
     System.out.println("2: " + someBPRequestVO.getProductType()); 
     System.out.println("3: " + someBPRequestVO.getProfileType()); 
     System.out.println("4: " + someBPRequestVO.getEffectiveDate()); 

     when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse); 

     mockTestClassFacade.getTestData(testString); 

     verify(mockBPService).getProduct(someBPRequestVO); 
    } 
} 

системы:

1: null 
2: ALL 
3: Required - TEST 
4: null 

То, что здесь происходит, что, когда я запускаю тест объект serviceResponse является нулем на линии в CUT обозначенной // ПРОБЛЕМА выше. Мое желание состоит в том, чтобы этот объект был заполнен моим объектом «invalidServiceResponse» из моего тестового метода. Судя по выводам моего System.out.println, кажется, что мой bpRequestVO соответствует моему someBPRequestVO в контенте.

Может ли кто-нибудь показать мне, что мне здесь не хватает?

Спасибо за ваше время!

+0

Скорее всего, это не будет соответствовать параметрам в getProduct что вы настраиваете в вас, когда (...) с тем, что передается в фактическом методе. Попробуйте использовать совпадения в том случае, когда (service.getProduct (argThat (...)). thenReturn. – LeffeBrune

+2

OP: вы shoudl принимаете ответ @ lewthor вместо этого я ошибся, переопределяя '.equals()' достаточно, вам не нужен аргумент-аргумент – fge

+0

Спасибо за последующий fge ... Я только что протестировал его с помощью .equals() и вернулся на эту страницу убедитесь, что я ничего не понял. Конечно, я нашел ваш комментарий! Я включил принятый ответ. Спасибо за вашу честность. – risingTide

ответ

8

Экземпляр BPRequestVO, который вы используете с when(), отличается от экземпляра, используемого в getTestData().
Если вы не переопределите equals(), они не совпадут.

Вам не нужно писать пользовательский Matcher, если вы переопределите equals(). Обратите внимание на следующее из Mockito documentation:.

«Пользовательский аргумент matchers может сделать тест менее читаемым Иногда лучше реализовать Equals() для аргументов, которые передаются издевается (Mockito естественно использует Equals() для сопоставления аргументов) Это может сделать тест чище."

+0

Спасибо lewthor! Я добавил символы .equals() (и .hashcode) в BPRequestVO, и теперь я вижу объект заполненного сервисаResponse в своем CUT, когда запускаю свой тестовый пример. – risingTide

4

Проблема в вашем использовании when().

Вы отправляете ссылку на построенный экземпляр; в результате, насмешка вернет то, что вы хотите, только если аргумент, переданный методу, равен той же ссылке.

Что вы хотите, это совпадение аргументов; что-то вроде:

when(mockBPService.getProduct(argThatMatches(someBPRequestVO)) 
    .thenReturn(whatYouWant); 

Конечно, для этого требуется написать аргумент.

Обратите внимание, что есть встроенные согласовани, который может делать то, что вы хотите:

when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant); 

Это согласовани конечно требует, чтобы ваш BPRequestVO класс реализует equals()hashCode() тоже)!

1

Вместо создания равных метода в вас классе BPRequestVO вы можете создать макет спор с„любой (YourObject.class)“, как это:

when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse); 
Смежные вопросы