0

我有一个 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;
4

0 回答 0