如何在不将可访问性更改为 true 的情况下在 junit 中测试 private 类
How to test private classes in junit whitout changing accessible to true
我有例子可以说明我的问题:
package com.example;
public class ExamplePublicClass {
public void doSomething() {
// a lot of code
String message = new ExamplePublicClass.MessageBuilder().withName("someName").build();
// a lot of code
}
private static class MessageBuilder {
private String name;
public MessageBuilder withName(String name) {
this.name = name;
return this;
}
public String build() {
return this.name + 1;
}
}
}
doSomething() 方法做了很多事情,还有很多遗留代码,但它有效,我不想碰她。
我唯一想做的就是将构建器更改为创建日志消息并为他编写测试。问题是 MessageBuilder 是私有的 class 并且将其更改为 public.In 没有任何意义我不想通过反射更改可见性。
我在同一个包中添加了一个 class 用于测试
package com.example;
import org.junit.Test;
public class MessageBuilderTest {
@Test
public void testMessageBuilder() {
String s = MessageBuilder..
}
}
但我无权访问此私人 class :(
工作代码位于
src/main/java
测试代码位于
src/test/java
你有什么事?我应该将项目结构更改为
来源
|/main/java
|/test/java
?
或者存在更好的解决方案?
最好的问候
T
我一直认为通过反射修改访问是一种不好的做法,它除了理解设计有问题之外别无用处。 :-)
一般来说,单元测试旨在测试public(或者实际上,非private
)接口class。所有 private
方法都是您不希望显式测试的实现细节。
当你在 class 中有 private
个方法并且你想对它们进行单元测试时,这被认为是 code smell 的标志,因为 class 可以是simplified/modified,这样private
单元是单元可测试的。
您可以执行以下操作之一:
- 将嵌套的
private static class
重构为顶级,并将其标记为包私有可访问。
- 提供
public
(或至少,非 private
)对您要测试的 private
单元的访问权限。
您还可以查看 this thread,其中对该主题进行了更广泛的讨论。
我有例子可以说明我的问题:
package com.example;
public class ExamplePublicClass {
public void doSomething() {
// a lot of code
String message = new ExamplePublicClass.MessageBuilder().withName("someName").build();
// a lot of code
}
private static class MessageBuilder {
private String name;
public MessageBuilder withName(String name) {
this.name = name;
return this;
}
public String build() {
return this.name + 1;
}
}
}
doSomething() 方法做了很多事情,还有很多遗留代码,但它有效,我不想碰她。
我唯一想做的就是将构建器更改为创建日志消息并为他编写测试。问题是 MessageBuilder 是私有的 class 并且将其更改为 public.In 没有任何意义我不想通过反射更改可见性。
我在同一个包中添加了一个 class 用于测试
package com.example;
import org.junit.Test;
public class MessageBuilderTest {
@Test
public void testMessageBuilder() {
String s = MessageBuilder..
}
}
但我无权访问此私人 class :(
工作代码位于
src/main/java
测试代码位于
src/test/java
你有什么事?我应该将项目结构更改为
来源 |/main/java |/test/java
?
或者存在更好的解决方案?
最好的问候 T
我一直认为通过反射修改访问是一种不好的做法,它除了理解设计有问题之外别无用处。 :-)
一般来说,单元测试旨在测试public(或者实际上,非private
)接口class。所有 private
方法都是您不希望显式测试的实现细节。
当你在 class 中有 private
个方法并且你想对它们进行单元测试时,这被认为是 code smell 的标志,因为 class 可以是simplified/modified,这样private
单元是单元可测试的。
您可以执行以下操作之一:
- 将嵌套的
private static class
重构为顶级,并将其标记为包私有可访问。 - 提供
public
(或至少,非private
)对您要测试的private
单元的访问权限。
您还可以查看 this thread,其中对该主题进行了更广泛的讨论。