Junit/Mockito如何模拟从类a调用的从类b调用的对象

vh0rcniy  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(236)

我有一个叫做a的类,它模仿一个b类。
类b具有通过调用数据访问对象(DAO)c来创建对象的方法。也就是说,a.method1 -> b.method2在内部调用c.getdata()
当我尝试创建一个单元测试时,我得到的对象c是空的。我该如何解决这个问题?

class Alpha {

    String abc;
    Beta beta = new Beta();
    List<String> seriesOfStgs = new ArrayList<>();

    public void alphaMethod() {
        seriesOfStgs.addAll(beta.getStrings());
    }
  }

  class Beta {

    StringDao stringDao = new StringDao();

    public List<String> getStrings() {
        return stringDao.getListOfStrings();
    }
  }

如果你看到上面的内容,我有两个独立的类AlphaBeta。我正在为Alpha编写测试。我可以在我的JUnit测试TestAlpha.java中模拟Beta。当我试图获取字符串时,我得到了一个空指针异常,因为stringDao是空的。
如何在TestAlpha中示例化stringDao,或者如何传递对StringDao的引用?

zyfwsgd6

zyfwsgd61#

您需要找到一种方法,将您的Beta模拟注入到您正在测试的Alpha对象中。

Beta beta = new Beta();

一种方法是在Alpha类中包含一个setBeta方法,然后可以在测试中调用它。
另一种方法是重构您的Alpha类,以便它从一个工厂获取它的Beta对象,然后在构造Alpha对象时注入工厂。

toiithl6

toiithl62#

Beta也可以是模拟对象。
例如,

@Mock
Alpha alpha;

@Mock
Beta beta;

...

when(alpha.getBeta()).thenReturn(beta);   // now you get mocked beta from alpha
when(beta.getStrings()).thenReturn("mock string");

相关问题