繁体   English   中英

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

[英]Junit - Mockito - how to setUp mocked objects properly

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

我创建了Day对象进行测试,并且嘲笑了诸如Database之类的东西。 但是我在正确设置它方面遇到了问题。

例如:一个返回Day以在我的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:在此处检测到放错位置的参数匹配器:->在service.activity.service.ActivitiesServiceTest.setUp(ActivitiesServiceTest.java:45)

您不能在验证或存根之外使用参数匹配器。 正确使用参数匹配器的示例:when(mock.get(anyInt()))。thenReturn(null); doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject()); 验证(模拟).someMethod(包含( “富”))

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

如消息所述

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表示形式返回为字符串

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

@Before
public void setUp() throws Exception {
     activitiesService = new ActivitiesService(databaseControllerMock);
}

@Test
public void testSomething() {
      when(eq(item).getJSON(anyString())).thenReturn(anyString());
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM