java - 抽象类 protected 方法 junit 测试用例

标签 java junit

考虑代码:

abstract public class TigerFinderPage extends TigerPage
private Manager manager;
protected Manager getTiger()
{
    //  If we haven't already done so,  get the tiger.
    if (tiger== null) {
        try {
            tiger= EntityResolution.getTigerFromName(ResTools.resolveNoTranslation(getConfigBundle(), "tiger", ""));
        } catch (Exception e) {
            LogTools.error(logger, null, e);
            return null;
        }
    }
    return tiger;
}

尝试1:

public class TigerFinderPageTest {

private TigerFinderPage tigerFinderPage;

@Before
public void setUp() throws Exception {

    TigerFinderPage = new TigerFinderPage () {
        @Override
        protected ResourceProvider getBundle() {
            return null;
        }

        @Override
        protected ResourceProvider getConfigBundle() {
            return null;
        }
    };
}

@Test
public void testTigerManager(){
    assertNull(tigerFinderPage.getTiger());
}
}

当 protected 方法位于不同的包中时,如何测试它们?我尝试过使用反射,但不知道在这种情况下如何实现它。

最佳答案

测试非公共(public)成员会将您的测试与实现联系起来,并使重构变得更加困难。

如果它足够重要以至于无法通过公共(public)接口(interface)进行测试,那么它必须是单独的功能,可以存在于自己的类中Single Responsibility Principle

在这种情况下,我有一个单独的类并针对 LazyTigerFactory 进行测试:

public final class LazyTigerFactory {
    private Manager manager;
    public Manager getTiger()
    {
        //  If we haven't already done so,  get the tiger.
        if (tiger == null) {
            try {
                tiger= EntityResolution.getTigerFromName(ResTools.resolveNoTranslation(getConfigBundle(), "tiger", ""));
            } catch (Exception e) {
                LogTools.error(logger, null, e);
                return null;
            }
        }
        return tiger;
    }
}

然后在你的类中使用它:

abstract public class TigerFinderPage extends TigerPage
    private final LazyTigerFactory tigerFactory = new LazyTigerFactory();
    protected Manager getTiger(){
       return tigerFactory.getTiger();
    }

好处

  • 您可以从工厂测试中获得有关创建的完整测试覆盖率,而不会扰乱您的 TigerFinderPage 测试。
  • 稍后您可以轻松地将 LazyTigerFactory 更改为另一个。
  • TigerFinderPage 的直接依赖项较少。
  • TigerFinderPage 更小,更少的 Lazy/Entity 样板困惑了这个类的真正作用(它的单一职责)。
  • 您甚至可以更改为注入(inject)工厂接口(interface),将其完全解耦,这可能有助于其他测试。

关于java - 抽象类 protected 方法 junit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27916334/

相关文章:

java - 将某些字符串模式替换为其他模式的内存有效方法是什么

android - TestNG Android 单元测试, stub !异常(exception)

java - 由于奇怪的错误,无法使用 Cucumber 启动 Junit 测试

java - 如何让 Spring 使用多个上下文 Autowiring 集成测试类?

java - WebDriver HTMLUnit 问题与 Ajax

java - new ArrayList<String>() 和 new ArrayList() 之间的区别

java - Jackson Databind 中是否有任何替代品来替代已弃用的属性 SerializationFeature.WRITE_NULL_MAP_VALUES ?

java - 确保 Spring 组件中线程安全的最高效方法是什么?

java - 如何单独启动JUnit测试?

java - 使用 gradle 使用外部参数运行 JUnit 测试