2016-06-10 417 views
0

我有這樣的代碼結構。方法methodToTestClassA呼籲在ClassA的方法以及以及在ClassBJava Mockito - 如何測試在同一個類中調用方法的方法以及其他類中的方法?

public class ClassA { 
    @Autowired 
    ClassB classB; 

    public void methodToTest() { 
     Object c = methodInA(); 
     Object d = classB.methodInB(c); 
    } 

    public Object methodInA() { 
     //do something 
    } 
} 

public class ClassB { 
    public Object methodInB(Object obj) { 
     //do something 
    } 
} 

我試圖嘲弄兩個呼叫即打電話methodInAmethodInB

下面的方法是單元測試代碼

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
public class ClassATest { 
    @InjectMocks 
    ClassA classA; 

    @Mock 
    ClassB classB; 

    @Spy 
    ClassA classASpy; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
    } 

    //Test method in ClassA 
    @Test 
    public void testMethodInA() { 
     Object mockObjA = mock(Object.class); 
     Object mockObjB = mock(Object.class); 

     doReturn(mockObjA).when(classASpy).methodInA(); 
     when(classB.methodInB(mockObjA)).thenReturn(mockObjB); 

     classA.methodToTest(); 

     //assertions 
    } 

} 

在運行測試,Object c爲空,但我希望它是等於mockObjA

我也嘗試過使用classASpy.methodToTest()進行調用。但是,它在methodToTest()Object d = classB.methodInB(c)處給出NullPointerException

測試此類情況的正確方法是什麼?

+0

使用Mockito註釋需要Mockito亞軍或適當的規則或initMocks調用,請參閱文檔:http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#mock_annotation – 2016-06-10 10:00:36

+0

我已經更新了測試代碼。我在setup方法中使用initMocks。我錯過了在這裏提及它。 – msfk

+0

你可以發佈[mcve]嗎? – 2016-06-10 10:20:37

回答

1

當您調用methodToTest時,您正在測試單元ClassA。通過嘲弄某個單位來改變被測試的單位並沒有多大意義。因爲那樣你會測試一些完全不同的東西,然後ClassA

你應該做的是測試classB.methodInB是否被調用了正確的參數。您可以使用ArgumentCaptor作爲調用classB.methodInB的參數。

ArgumentCaptor<Object > argument = ArgumentCaptor.forClass(Object .class); 
verify(mockObjB).methodInB(argument.capture()); 
Object capturedArgument = argument.getValue(); 

然後你就capturedArgument斷言驗證ClassA.methodInA工作正常。

+0

但是接下來我將不得不模擬所有在'methodInA()'中調用的外部方法調用,如果'methodInA'真的很複雜,那麼在每個使用'methodInA()' – msfk

+0

@msfk的方法的測試中, 'ClassA'不符合單一責任原則。如果是這樣的話,將'methodnInA'提取到它自己的接口可能是有意義的。然後你也可以模擬對'methodInA'的調用。 – SpaceTrucker

+0

我從實際的類中分離出一個輔助類,並將這些方法作爲公共方法移動到輔助類中。這是一個很好的做法嗎? – msfk

相關問題