java - 使用mockito填充列表

标签 java junit

我有一个想要测试的类(class)。

public class MinicabManager {
public static Set<Driver> allDrivers ;
public static Set<Passenger> allPassengers;
public static List<Trip> trips;

public static Set<Driver> findFakeDrivers() {
    Set<Driver> fakeDrivers = new HashSet();
    for (Trip t : trips) {
        for (Driver d : allDrivers) {
            if (t.getDriver().getDriver() != d.getDriver()) {
                fakeDrivers.add(d);
            }
        }
    }
    return fakeDrivers;
}

当我运行此测试时,我得到 NullPointerException :

@RunWith(MockitoJUnitRunner.class)
public class MinicabManagerTest {
@Mock
Set<Driver> allDrivers;
@Mock
Set<Passenger> allPassengers;
@Mock
List<Trip> trips;
@InjectMocks
MinicabManager minicabManager;
@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
minicabManager = new MinicabManager();

    allDrivers = new HashSet();
    allPassengers = new HashSet();
    trips = new ArrayList();

    Driver d1 = new Driver();
    d1.setDriver("d1");
    Driver d2 = new Driver();
    d2.setDriver("d2");
    allDrivers.add(d1);
    allDrivers.add(d2);

    Passenger p1 = new Passenger();
    p1.setName("p1");
    Passenger p2 = new Passenger();
    p2.setName("p2");
    allPassengers.add(p1);
    allPassengers.add(p2);

    Trip t1 = new Trip();
    t1.setDriver(d1);
    t1.setPassengers(allPassengers);
    trips.add(t1);
}
@Test
public void testFindFakeDrivers() throws Exception {
    Set<Driver> result = minicabManager.findFakeDrivers();
}

如何填充列表? 据我了解,InjectMocks 通过模拟列表注入(inject)并设置,然后在每个测试用例之前填充。但我得到 NullPointerException

最佳答案

  • 不要模拟对象并正常实例化它们。要么做其中之一,要么做另一个。 @Mock 注解将为您创建一个模拟对象,您可以在测试中轻松使用它。
  • 知道模拟对象是一个“假”对象,它只是假装属于某种类型。因此,如果您在模拟对象上调用任何方法/字段,它实际上不会执行任何操作(并且在非 void 方法的情况下将始终返回 null)。
  • 您无需指定 MockitoJUnitRunner 并调用 initMocks() 方法。其中一个就足够了。
  • 正如其他人提到的,您的测试似乎不需要模拟。所以它可能看起来像这样:
public class MinicabManagerTest {

        @Before
        void setUp() {

            Set<Driver> allDrivers = new HashSet<>();
            Set<Passenger> allPassengers = new HashSet<>();
            List<Trip> trips = new ArrayList<>();

            Driver d1 = new Driver();
            d1.setDriver("d1");
            Driver d2 = new Driver();
            d2.setDriver("d2");
            allDrivers.add(d1);
            allDrivers.add(d2);

            Passenger p1 = new Passenger();
            p1.setName("p1");
            Passenger p2 = new Passenger();
            p2.setName("p2");
            allPassengers.add(p1);
            allPassengers.add(p2);

            Trip t1 = new Trip();
            t1.setDriver(d1);
            t1.setPassengers(allPassengers);
            trips.add(t1);

            MinicabManager.allDrivers = allDrivers;
            MinicabManager.allPassengers = allPassengers;
            MinicabManager.trips = trips;
        }

        @Test
        public void testFindFakeDrivers() throws Exception {
            Set<Driver> result = MinicabManager.findFakeDrivers();
            // assertions about the result here
        }

此外,请注意不要将字符串与 =!= 进行比较。使用equals()方法。

关于java - 使用mockito填充列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625582/

相关文章:

使用时出现 Java ClassCastException?延伸

Android jUnit 测试 java.lang.NoClassDefFoundError : android/database/sqlite/SQLiteOpenHelper

java - Maven 依赖项在 Spring 配置中不可见

Java JTree 节点是一个可点击的 URL 链接

android - 如何测试 Android ActionBar 子菜单?

junit - 如何在运行时执行junit测试用例?

java - 如何使用junit测试java中的注释

java - Intellij 和 MAVEN 之间 Junits 的代码覆盖率不匹配

java - 如何在调用层次结构中一直向上引入新参数?

java - Hibernate - 选择 OneColumn 并以列表形式获取结果