如何在不初始化的情况下模拟内部成员 class
How to mock internal members without initializing class
我想为以下内容编写单元测试class:
public class Target() {
private final Member member = new Member();
public Target() {
}
}
我想用模拟的 Member 实例初始化此 Target class,因为在测试期间实例化 Member 是不可行的。任何框架都可以吗?
编辑:
我不想模拟 Target class。我打算在初始化的时候mock Memberclass
Object method() {
member.differentMethod();
//Logic which I want to test
}
请建议如何模拟此调用成员 class 的方法。
您应该将 Target class 使用的 Member 实例传递给 Target class 的构造函数。
通过这样做,您可以在生产环境中使用您成员 class 的实现,并在测试环境中使用另一个实现(可能为空)。
最好和最优的解决方案是使用依赖性Inversion/Injection原则
您可以使用 constructor mocking with Powermock:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Target.class)
public class Test {
@Test
public void doSomething() throws Exception {
Member mockMember = mock(Member.class);
PowerMockito.whenNew(Member.class).thenReturn(mockMember);
Target thisTargetWillHaveYourMockAsField = new Target();
//Your test code
}
}
要建立 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;
}
}
通过提供多个构造函数,您可以确保生产中的消费者根本不需要更改。这也是与 "testing code polluting production" 不同的情况:您的 use-cases 之一(特别是测试)需要成员的自定义实现,并且您正在提供 most-encapsulated 访问权限以替换该成员按照规格。
另请参阅: How to use Mockito when we cannot pass a mock object to an instance of a class
我想为以下内容编写单元测试class:
public class Target() {
private final Member member = new Member();
public Target() {
}
}
我想用模拟的 Member 实例初始化此 Target class,因为在测试期间实例化 Member 是不可行的。任何框架都可以吗?
编辑:
我不想模拟 Target class。我打算在初始化的时候mock Memberclass
Object method() {
member.differentMethod();
//Logic which I want to test
}
请建议如何模拟此调用成员 class 的方法。
您应该将 Target class 使用的 Member 实例传递给 Target class 的构造函数。
通过这样做,您可以在生产环境中使用您成员 class 的实现,并在测试环境中使用另一个实现(可能为空)。
最好和最优的解决方案是使用依赖性Inversion/Injection原则
您可以使用 constructor mocking with Powermock:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Target.class)
public class Test {
@Test
public void doSomething() throws Exception {
Member mockMember = mock(Member.class);
PowerMockito.whenNew(Member.class).thenReturn(mockMember);
Target thisTargetWillHaveYourMockAsField = new Target();
//Your test code
}
}
要建立 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;
}
}
通过提供多个构造函数,您可以确保生产中的消费者根本不需要更改。这也是与 "testing code polluting production" 不同的情况:您的 use-cases 之一(特别是测试)需要成员的自定义实现,并且您正在提供 most-encapsulated 访问权限以替换该成员按照规格。
另请参阅: How to use Mockito when we cannot pass a mock object to an instance of a class