Java 如何在不初始化类的情况下模拟内部成员
我想为以下类编写单元测试:Java 如何在不初始化类的情况下模拟内部成员,java,unit-testing,testing,mocking,mockito,Java,Unit Testing,Testing,Mocking,Mockito,我想为以下类编写单元测试: public class Target() { private final Member member = new Member(); public Target() { } } 我想用Member的模拟实例初始化这个目标类,因为在测试期间实例化Member是不可行的。这在任何框架下都是可能的吗 编辑: 我不想模仿目标类。我打算在初始化时模拟成员类 Object method() { member.differentMetho
public class Target() {
private final Member member = new Member();
public Target() {
}
}
我想用Member的模拟实例初始化这个目标类,因为在测试期间实例化Member是不可行的。这在任何框架下都是可能的吗
编辑:
我不想模仿目标类。我打算在初始化时模拟成员类
Object method() {
member.differentMethod();
//Logic which I want to test
}
请建议如何模拟对成员类方法的调用。您应该将目标类使用的成员实例传递给目标类的构造函数 通过这样做,您可以在生产环境中使用成员类的实现,并在测试环境中使用另一个实现(可能为空)
最佳解决方案是使用依赖项反转/注入原则您应该将目标类使用的成员实例传递给目标类的构造函数 通过这样做,您可以在生产环境中使用成员类的实现,并在测试环境中使用另一个实现(可能为空) 最佳解决方案是使用依赖项反转/注入原则您可以使用: 您可以使用:
要根据Prim的答案(向上投票),只需给自己两个构造函数
public class Target() {
private final Member member;
public Target() {
this.member = new Member();
}
/** Testing constructor. Package-private visibility for tests in the same package. */
Target(Member member) {
this.member = member;
}
}
通过提供多个构造函数,您可以确保生产中的消费者根本不需要更改。这也是一个与“测试代码污染生产”不同的案例:您的一个用例(特别是一个测试)需要一个成员的自定义实现,并且您正在按照规范为该成员的替换提供最封装的访问
另请参见:要根据Prim的答案(向上投票),只需给自己两个构造函数即可
public class Target() {
private final Member member;
public Target() {
this.member = new Member();
}
/** Testing constructor. Package-private visibility for tests in the same package. */
Target(Member member) {
this.member = member;
}
}
通过提供多个构造函数,您可以确保生产中的消费者根本不需要更改。这也是一个与“测试代码污染生产”不同的案例:您的一个用例(特别是一个测试)需要一个成员的自定义实现,并且您正在按照规范为该成员的替换提供最封装的访问
另请参见:是您的easymock/mocito/powermock框架。但您只是对模拟框架感兴趣还是想测试目标类本身?我希望测试目标类。但是,每当我尝试初始化Target()时,就会收到一个错误,因为它在内部调用Member(),这需要设置我想要避免的资源负载。我知道如何使用带参数的构造函数用模拟对象初始化类。但我不知道在这种情况下该如何做。这是没有意义的,但嘲笑目标类,你打算如何测试目标类本身?有一些误解。我不想模拟目标类,而是模拟其中的成员类。更新了描述。不要使用这种隐式依赖项和紧密绑定,而是将成员对象作为参数传递给构造函数(构造函数注入)。这样,您就可以通过单元测试中的模拟成员。但您只是对模拟框架感兴趣还是想测试目标类本身?我希望测试目标类。但是,每当我尝试初始化Target()时,就会收到一个错误,因为它在内部调用Member(),这需要设置我想要避免的资源负载。我知道如何使用带参数的构造函数用模拟对象初始化类。但我不知道在这种情况下该如何做。这是没有意义的,但嘲笑目标类,你打算如何测试目标类本身?有一些误解。我不想模拟目标类,而是模拟其中的成员类。更新了描述。不要使用这种隐式依赖项和紧密绑定,而是将成员对象作为参数传递给构造函数(构造函数注入)。这样你就可以通过单元测试中的模拟成员。是的,我知道这种方法。但是有没有一种方法可以在不更改NoArgsConstructor的情况下执行此操作?您可以在Target中使用no args构造函数,方法是实现一个委托创建成员实例的提供程序类,并根据生产或测试环境返回不同的实现,我想我必须以某种方式改变目标类的设计方式,以便正确地测试它。通过更改构造函数,或者使用提供程序类或工厂来初始化成员。让我们看看是否有人提出了一个基本上不需要更改目标类的解决方案。是的,我知道这个方法。但是有没有一种方法可以在不更改NoArgsConstructor的情况下执行此操作?您可以在Target中使用no args构造函数,方法是实现一个委托创建成员实例的提供程序类,并根据生产或测试环境返回不同的实现,我想我必须以某种方式改变目标类的设计方式,以便正确地测试它。通过更改构造函数,或者使用提供程序类或工厂来初始化成员。让我们看看是否有人提出了一个基本上不需要更改目标类的解决方案。这就是我一直在寻找的!这对我的案子很有效。不需要为测试更改类设计。很高兴听到它的帮助。谢谢你接受答案。特写。这就是我要找的!这对我的案子很有效。不需要为测试更改类设计。很高兴听到它的帮助。谢谢你接受答案。铜。