Junit - Mockito - 如何正确设置模拟对象

时间:2018-05-22 15:14:07

标签: java unit-testing testing junit mockito

我正在为不同的方法创建测试,但所有这些方法都非常相似 - 向Day添加了一些东西。

我已经为测试创建了Day对象,并且我已经模拟了一些像Database这样的东西。但是我在设置这个问题时遇到了问题。

例如:在我的addSomething()方法中返回Day以使用此日的一种方法是这样的:

Item item = dbService.get(tableName, Collections.singletonList(primaryKey));
String measurementsJSON = item.getJSON("measurements");

我嘲笑了数据库和项目,我想在之前设置'所以我这样做了:

@Before
public void setUp() throws Exception {
    activitiesService = new ActivitiesService(databaseControllerMock);
    when(eq(item).getJSON(anyString())).thenReturn(anyString());
}

但在这种情况下,我收到了错误:

java.lang.NullPointerException
at service.activity.service.ActivitiesServiceTest.setUp(ActivitiesServiceTest.java:45) //this line with "when..."

还有其他错误:

  

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:       在这里检测到错位的参数匹配器:        - > at service.activity.service.ActivitiesServiceTest.setUp(ActivitiesServiceTest.java:45)

     

您不能在验证或存根之外使用参数匹配器。   正确使用参数匹配器的示例:   当(mock.get(anyInt()))thenReturn(空)。 doThrow(新   的RuntimeException())时(模拟).someVoidMethod(anyObject())。   验证(模拟).someMethod(含有("富&#34))

     

此外,此错误可能会显示,因为您将参数匹配器与无法模拟的方法一起使用。   以下方法无法进行存根/验证:final / private / equals()/ hashCode()。

2 个答案:

答案 0 :(得分:1)

正如消息所说

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);

更改

when(eq(item).getJSON(anyString())).thenReturn(anyString());

返回某些字符串,类似于

when(eq(item).getJSON(anyString())).thenReturn("{somekey:somevalue}");

我假设您要将json表示形式返回为字符串

答案 1 :(得分:0)

你不应该在setUp方法中使用when子句。

this.classList

此外,如果您可以添加您想要测试的课程,我们可以更轻松地提供帮助。