2016-06-10 249 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

相关问题