【问题标题】:How to test private classes in junit whitout changing accessible to true如何在junit中测试私有类而不改变可访问性为true
【发布时间】:2015-01-22 07:49:45
【问题描述】:

我有一个例子来说明我的问题:

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 是一个私有类,将其更改为公共类没有意义。此外,我不想通过反射改变可见性。

我在同一个包中添加了一个测试类

package com.example;

import org.junit.Test;

public class MessageBuilderTest {

    @Test
    public void testMessageBuilder() {
        String s = MessageBuilder..
    }

}

但我无权访问这个私人课程:(

工作代码位于

src/main/java

测试代码所在位置

src/test/java

你怎么了?我应该将项目结构更改为

源代码 |/main/java |/test/java

?

或者存在更好的解决方案?

最好的问候 T

【问题讨论】:

    标签: java junit


    【解决方案1】:

    我一直认为通过反射修改访问是一种不好的做法,这对了解设计存在问题无济于事。 :-)

    通常,单元测试旨在测试类的公共(或实际上是非private)接口。所有private 方法都是您不希望显式测试的实现细节。

    当你在一个类中有private 方法并且你想对它们进行单元测试时,这被认为是code smell 的标志,因为类可以被简化/修改,所以private 单元是可单元测试的。

    您可以执行以下操作之一:

    • 将嵌套的private static class 重构为顶级,并将其标记为包私有可访问。
    • 为您要测试的private 单元提供public(或至少非private)访问权限。

    您还可以查看this thread,该主题的讨论更为广泛。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-12-24
      相关资源
      最近更新 更多