2012-11-12 78 views
2

这是一个非常新手的问题,但我不知道如何存根。如何使用然后返回课程?

我必须模拟一个方法来返回类像这样。

public Class<? extends SomeClass> getAClass(); 

,如果我做这样的事情

when(this.someInstance.getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 

我得到的编译错误。

The method thenReturn(Class<capture#1-of ? extends SomeClass>) in the type OngoingStubbing<Class<capture#1-of ? extends SomeClass>> is not applicable for the arguments (Class<SomeClassThatExtendsSomeClass>) 
+2

你得到的错误是什么? – mikej

+0

然后返回类型为OngoingStubbing )。 extends SomeClass >>不适用于参数(Class ) – toy

+0

SomeClassThatExtendsSomeClass的定义是什么样子? –

回答

4

如果方法声明中可以改变什么@Bohemian以上建议,

public <T extends SomeClass> Class<T> getAClass(); 

,那么你可以写你的mock声明如下:

when(this.someInstance.<SomeClassThatExtendsSomeClass>getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 

Oth erwise的doReturn语义应使用如下:

Mockito 
    .doReturn(SomeClassThatExtendsSomeClass.class) 
    .when(this.someInstance.<SomeClassThatExtendsSomeClass>getAClass()); 
+0

如果我不能更改方法声明怎么办? – toy

+0

然后,在使用'when()。thenReturn()'语义时,应该使用较少的类型安全的'doReturn()'语义来避免编译器错误。 – Vikdor

0

尝试键入方法:

public <T extends SomeClass> Class<T> getAClass(); 

when(this.someInstance.getAClass()) 
    .thenReturn(SomeClassThatExtendsSomeClass.class); 
+0

然后错误是'thenReturn(Class )不适用于参数类'。 – Vikdor

2

如果你不能改变的方法声明,使其与thenReturn工作,那么你可以使用thenAnswer

when(this.someInstance.getAClass()).thenAnswer(new Answer<Class<? extends SomeClass>>() { 
      @Override 
      public Class<? extends SomeClass> answer(InvocationOnMock invocation) throws Throwable { 
       return SomeClassThatExtendsSomeClass.class; 
      } 
}); 

虽然它不是如果仅仅为了返回一个固定的值而执行Answer是不理想的,这应该适用于您的场景。

相关问题