我有一个 Kotlin 类 SomeAccessor.kt,它在 Java 类 SomeService.java 中使用。我需要在 SomeServiceTest.java 中模拟 SomeAccessor
SomeAccessor.kt:
open class SomeAccessor @Inject constructor(private val dataStoreClient: DataStoreClient) {
fun getSomeProperty(someString: String, someEnum: SomeEnumClass): SomeAccessor {
someLogic();
return dataStoreClinet.getData(someString, someEnum);
}
}
SomeEnumClass.kt:
enum class SomeEnumClass {
TypeA, TypeB, TypeC
}
SomeServiceTest.java:
public class SomeServiceTest {
@Mock
private ClassA classA;
@Mock
private ClassB classB;
@Mock
private SomeAccessor someAccessor;
@InjectMocks
private SomeService someService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someFunction_should_success() {
testData = fetchMockTestData();
mock_someAccessor_to_return_mock_data_when_getSomeProperty_is_called();
Assert.assertEquals(someService.someFunction(testData), expectedValue);
}
}
我尝试了以下方法:
doReturn(someProperty).when(someAccessor).getSomeProperty("ABC", SomeEnumClass.TypeA);
Throws:
java.lang.NullPointerException
at SomeAccessor.getSomeProperty(SomeAccessor.kt)
at SomeServiceTest.someFunction_should_success(SomeServiceTest.java)
\\ This is probably because actual getSomeProperty is being called and the dataStoreClient doesnt exist which produces NPE.
doReturn(someProperty).when(someAccessor).getSomeProperty(any(), any());
Throws:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method getSomeProperty, parameter someString
doReturn(someProperty).when(someAccessor).getSomeProperty(anyString(), any());
Throws:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method getSomeProperty, parameter someEnum
doReturn(someProperty).when(someAccessor).getSomeProperty(Matchers.anyString(), Matchers.any(SomeEnumClass.class));
Throws:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method getSomeProperty, parameter someEnum
when(someAccessor.getSomeProperty(Matchers.anyString(), Matchers.any(SomeEnumClass.class))).thenReturn(someProperty);
Throws:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method getSomeProperty, parameter someEnum
此外,如果这成功了,我的确切用例将是:someFunction(testData)将使用不同的参数调用someAccessor.getSomeProperty()三次,基于需要返回不同的模拟值,如下所示。
doReturn(someProperty1).when(someAccessor).getProperty(someString1,SomeEnumClass.TypeA)
doReturn(someProperty2).when(someAccessor).getProperty(someString2,SomeEnumClass.TypeB)
doReturn(someProperty3).when(someAccessor).getProperty(someString3,SomeEnumClass.TypeC)
依赖项:
junit = 4.12;
Mockito = 1.10;