2017-05-11 91 views
0
@Component 
class ClassA{ 

    @Autowired 
    ClassB classB; 
    public void doSomething(){ 
     classD.createValues(a,b); 
     //create values calls ClassB method 
    } 
} 

@Component 
class ClassB{ 

    @Autowired 
    DynamoDBMapper mapper; 

    public void doSomething(){ 
     mapper.scan(classC.class,new DynamoDBScanExpression()).stream(); 
    } 

} 

测试类无法模拟的方法

@RunWith(SpringJUnit4ClassRunner.class) 
class TestClass{ 

    @InjectMocks 
    @Autowired 
    ClassA classA; 

    @Mock 
    ClassD classD; 

    @Autowired 
    @Qualifier("dynamodbMapper") 
    private DynamoDBMapper mockedDynamoDBMapper; 
    // globally mocked in config 

     @Test 
     public void testWithValidData() { 
      A a = new A(); 
      B b = new B(); 
      setUp(classA); 
      mockDynamoDBCall(); 
      classA.doSomthing(); 
     } 

      private void setUp(ClassA classA){ 
       Mockito.when(classD.createValues(a,b)).thenReturn(Matchers.any(Reponse.class)); // problem after mockDynamoDBCall() 
      } 
      private void mockDynamoDBCall(){ 
       when(mapper.scan(Mockito.eq(Object.class), Mockito.any(DynamoDBScanExpression.class))). 
       thenReturn(mockPaginatedScanList); 
       when(mockPaginatedScanList.stream()).thenReturn(createDummyData().stream()); 
      } 
} 

,当我不是嘲笑DynamoDBMapper其工作的罚款。

嘲讽DynamoDB映射器后,它处在设置方法抛出异常

[junit]  Caused an ERROR 
[junit] 
[junit] Invalid use of argument matchers! 
[junit] 2 matchers expected, 1 recorded: 
[junit] -> at <class name> 
[junit] 
[junit] This exception may occur if matchers are combined with raw values: 
[junit]  //incorrect: 
[junit]  someMethod(anyObject(), "raw String"); 
[junit] When using matchers, all arguments have to be provided by matchers. 
[junit] For example: 
[junit]  //correct: 
[junit]  someMethod(anyObject(), eq("String by matcher")); 
[junit] 
[junit] For more info see javadoc for Matchers class. 
[junit] 
[junit] org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
[junit] Invalid use of argument matchers! 
[junit] 2 matchers expected, 1 recorded: 
[junit] -> at <class name> 
[junit] 
[junit] This exception may occur if matchers are combined with raw values: 
[junit]  //incorrect: 
[junit]  someMethod(anyObject(), "raw String"); 
[junit] When using matchers, all arguments have to be provided by matchers. 
[junit] For example: 
[junit]  //correct: 
[junit]  someMethod(anyObject(), eq("String by matcher")); 

我试图通过Matchers.any(类名)和Matcher.any()作为参数,但仍然我得到相同的异常

回答

2

此行

Mockito.when(classD.createValues(a,b)).thenReturn(Matchers.any(Reponse.class)); 

是没有意义的。你必须告诉Mockito要回报什么。你不能只是告诉它返回任何Response.class。这不是匹配者所做的事情。

匹配器用于检查传递给方法的参数。他们不能在thenReturn之后使用。

如果你解决这个问题,错误将消失。

+0

我知道,但添加mockDynamoDBCall()之前为什么它工作正常?任何想法? –

+0

是的,所有创建“匹配器”的方法实际上都将Mockito自己的内部堆栈上的“匹配器”,等待存根或验证呼叫。如果您没有进行存根或验证电话,Mockito无法检测到错误。 –

+0

你能否向我提供有关这方面的任何文件? –