java构造函数在junit测试期间为类方法返回null

8fsztsew  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(337)
public classA() {

    public String getName() {
        return "ClassA";
    }
}

public classB() {

    public String getName() {
        return "ClassB";
    }
}

public ClassC {

    List<> list = new ArrayList<>();

    @Autowired
    public ClassC(final ClassA classA, final ClassB classB) {
        list.add(classA);
        print(classA.getName()); //prints null
        list.add(classB);
    }
}

——————
我试着测试c类,如下所示,

@Mock
private ClassA classA;

@Mock
private ClassB classB;

@InjectMocks
private ClassC classC;

它似乎在classc构造函数中注入类,但在从这些类中提取数据时返回null。有没有办法通过单元测试在classc构造函数中成功地检索getname()字符串?

o75abkj4

o75abkj41#

这个 getName 类A和类B中的方法是void类型。你可以把它们改回来 String 看看能不能帮上忙。
仅供参考的是一个类a重载方法上的getname(),请参见https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/class.html#getname()所以您也可以删除 getName 方法分为a类和b类。
请告诉我这是否有用。
-卡吉:)

pvabu6sv

pvabu6sv2#

这就是mockito的设计原理。创建模拟对象时,例如:

@Mock
private ClassB classB;

mockito将使用bytebuddy创建另一个类,并在运行时编译该类。另一件事是该类的所有方法都将被截获。默认的拦截器总是返回 null 值或原子值的默认值。例如 0 为了 int .
不管原始方法总是返回相同的stirng。模拟对象将返回 null .
简言之,mockito将创建一个完全不同的类和该类的一个对象。
所以你需要模仿的方法,比如

when(classB.getName(any())).thenReturn("classB");

相关问题