考虑代码:
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/