所以我开始为我们的Java-spring项目写测试。
我用的是JUnit和Mockito。据说,当我使用when()...thenreturn()选项时,我可以模拟服务,而不需要模拟它们。所以我想做的是,设定:
when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)
但是无论我做哪个when-clause,我总是得到一个NullpointerException,这当然是有意义的,因为input是null。
同样,当我试图从一个对象模拟另一个方法时:
when(object.method()).thenReturn(true)
这里我还得到一个Nullpointer,因为该方法需要一个变量,而这个变量没有设置。
但是我想使用when()..thenreturn()来绕过创建这个变量等等。我只想确定,如果任何类调用这个方法,那么不管怎么样,只要返回true或上面的列表就行了。
从我的角度来看,这基本上是一种误解,还是有别的问题?
代码:
public class classIWantToTest implements classIWantToTestFacade{
@Autowired
private SomeService myService;
@Override
public Optional<OutputData> getInformations(final InputData inputData) {
final Optional<OutputData> data = myService.getListWithData(inputData);
if (data.isPresent()) {
final List<ItemData> allData = data.get().getItemDatas();
//do something with the data and allData
return data;
}
return Optional.absent();
}
}
下面是我的测试类:
html" target="_blank">public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2;
@Mock
private SomeService myService;
@Before
public void setUp() throws Exception {
classUnderTest = new ClassUnderTest();
myService = mock(myService.class);
classUnderTest.setService(myService);
item1 = mock(DeliveryItemData.class);
item2 = mock(DeliveryItemData.class);
}
@Test
public void test_sort() {
createData();
when(myService.getListWithData(inputdata).get().getItemDatas());
when(item1.hasSomething()).thenReturn(true);
when(item2.hasSomething()).thenReturn(false);
}
public void createData() {
item1.setSomeValue("val");
item2.setSomeOtherValue("test");
item2.setSomeValue("val");
item2.setSomeOtherValue("value");
allData.add(item1);
allData.add(item2);
}
我也遇到了同样的问题,我的问题只是没有正确地使用@RunWith对类进行注释。在您的示例中,请确保您具有:
@RunWith(MockitoJUnitRunner.class)
public class Test {
...
一旦我这样做了,NullPointerExceptions就消失了。
我遇到了这个问题,我的问题是我用any()
而不是anyint()
调用我的方法。所以我有:
doAnswer(...).with(myMockObject).thisFuncTakesAnInt(any())
我不得不把它改成:
doAnswer(...).with(myMockObject).thisFuncTakesAnInt(anyInt())
我不知道为什么会产生NullPointerException。也许这会帮助下一个可怜的灵魂。
对于布尔方法,您尚未截尾的方法的默认返回值为false
,对于返回集合或映射的方法,默认返回值为空集合或映射,否则为null
。
这也适用于中的方法调用(...)
。在您的示例中,When(MyService.GetListWithData(inputData).Get())
将导致NullPointerException,因为MyService.GetListWithData(inputData)
为Null
-以前没有将其挂起。
一个选项是为所有中间返回值创建mock,并在使用之前将它们存根。例如:
ListWithData listWithData = mock(ListWithData.class);
when(listWithData.get()).thenReturn(item1);
when(myService.getListWithData()).thenReturn(listWithData);
或者,您可以在创建模拟时指定不同的默认答案,以使方法返回新的模拟而不是NULL:returns_deep_stubs
SomeService myService = mock(SomeService.class, Mockito.RETURNS_DEEP_STUBS);
when(myService.getListWithData().get()).thenReturn(item1);
您应该阅读mockito.returns_deep_stubs的Javadoc,它对此进行了更详细的解释,并对其用法提出了一些警告。
希望这能帮上忙。只需注意,您的示例代码似乎有更多的问题,例如缺少assert或verify语句以及在模拟上调用setter(这没有任何影响)。
使用或,是否有任何方法可以拦截对对象的非静态方法的调用,或者至少是对单例对象的非静态方法的调用? 以下类提供了一个示例: 但是,上面的类只提供了一个私有构造函数,因此不能对其进行扩展。使用返回部分模拟(spy)也不会起作用,因为类不提供无参数构造函数。 想要的嘲弄能以其他任何方式实现吗?对于非单例类可以这样做吗?
问题内容: 因此,我开始为我们的Java Spring项目编写测试。 我使用的是JUnit和Mockito。有人说,当我使用when()… thenReturn()选项时,可以模拟服务,而无需模拟它们。所以我要做的是设置: 但是无论我执行哪一个子句,我总会得到一个NullpointerException,这当然是有道理的,因为input为null。 另外,当我尝试从对象模拟另一个方法时: 在那里,
我有一个工厂接口B,它返回类型a的对象。类型a也是一个接口。 我很难弄清楚如何在模拟中为.doSomething()定义方法行为,因为每当工厂返回一个新的实例时,它都需要知道如何doSomething()。 这就是我到目前为止嘲笑工厂的地方,但是A不知道如何做()。 是否有某种方法可以为将返回的所有实例定义。doSomething()? 非常感谢任何帮助。
我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。 我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。 以下是测试课程: 以下是正在测试的系统:
问题内容: 我正在使用Mockito测试旧版JAAS / LDAP登录模块。 该接口定义了以下功能: 我期望包含一个,这是需要进行操作才能通过测试的对象。 有没有一种方法可以有效地对此进行模拟,或者我可以通过实施存根实现更好呢? 问题答案: 对于返回的函数,请使用doAnswer() 和执行拦截必须在作为参数,例如,作为一个匿名类: 在这种情况下将是数组!
我有一个类,它有两个方法。我想模拟这个类,然后模拟第一个方法,但不是第二个。 例如。 单元测试代码: 奇怪的是m2没有被调用。 我错过什么了吗?