Java 初始化模拟类中的私有字段

Java 初始化模拟类中的私有字段,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我的类中有一个私有字段和一个方法,如果设置了某个标志并且映射包含某个值,则该方法将对其进行修改。我想测试一下这个方法,看看结果。以下是为简洁起见推荐的与代码无关的字段和方法: 我的班级: 我的测试: 当我运行测试时,我在UsersLoader类中得到一个NullPointerException,在检查status.getSOME_键的with IF子句中。即使我解决了这个问题,下一个NPE也会在下面一行,因为我的用户是空的。如何在模拟类中初始化私有字段,以便使用它们?我可以创建一个getter和

我的类中有一个私有字段和一个方法,如果设置了某个标志并且映射包含某个值,则该方法将对其进行修改。我想测试一下这个方法,看看结果。以下是为简洁起见推荐的与代码无关的字段和方法:

我的班级:

我的测试:


当我运行测试时,我在UsersLoader类中得到一个NullPointerException,在检查status.getSOME_键的with IF子句中。即使我解决了这个问题,下一个NPE也会在下面一行,因为我的用户是空的。如何在模拟类中初始化私有字段,以便使用它们?我可以创建一个getter和setter并模拟它们,但是整个测试就失去了意义。

在您的情况下,您可以使用间谍而不是模拟

这将触发构造函数并将空列表分配给私有变量,从而转义NPE:

private UsersLoader loader;

@Before
public void setUp() {
  loader = spy(new UsersLoader());
}
现在您无需拨打此电话:

  doCallRealMethod().when(loader).loadExternalUsers(anyBoolean());

请记住,您需要模拟任何不需要在实现时触发的方法。

在您的情况下,您可以使用间谍而不是模拟

这将触发构造函数并将空列表分配给私有变量,从而转义NPE:

private UsersLoader loader;

@Before
public void setUp() {
  loader = spy(new UsersLoader());
}
现在您无需拨打此电话:

  doCallRealMethod().when(loader).loadExternalUsers(anyBoolean());

请记住,您需要模拟任何不需要在实现时触发的方法。

首先,将初始化移动到字段声明:

private Collection<User> users = new ArrayList<>();
然后,您可以使用自己的模拟注入此字段:

@RunWith(MockitoJUnitRunner.class)
class UsersLoaderTest {
       @Mock
       private Collection<User> users;
       @InjectMocks
       private UsersLoader loader;
}

然后验证是否使用您期望的用户调用了users.add。

首先,将初始化移动到字段声明:

private Collection<User> users = new ArrayList<>();
然后,您可以使用自己的模拟注入此字段:

@RunWith(MockitoJUnitRunner.class)
class UsersLoaderTest {
       @Mock
       private Collection<User> users;
       @InjectMocks
       private UsersLoader loader;
}

然后验证users.add是否与您期望的用户一起调用。

不要模拟UsersLoader.class,这是包含要测试的方法的类。当您创建一个mock时,不会实现mock类,相反,您可以模拟该类的功能。而是监视它,或者只是实例化并提供功能的手写检查。在后一种情况下,您根本不需要Mockito。因此,您可以监视它并使用mockito的功能来测试功能

不要模拟UsersLoader.class,这是包含要测试的方法的类。当您创建一个mock时,不会实现mock类,相反,您可以模拟该类的功能。而是监视它,或者只是实例化并提供功能的手写检查。在后一种情况下,您根本不需要Mockito。因此,您可以监视它并使用mockito的功能来测试功能,这是正确的答案。模拟一个对象来测试它是。。。嗯,完全错了!这是正确的答案。模拟一个对象来测试它是。。。嗯,完全错了!