如何在不将可访问性更改为 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,其中对该主题进行了更广泛的讨论。