2017-04-24 40 views
1

是否有单元测试注释或功能标记,我可以在我的java源代码中插入,以便只有在运行单元测试时才会触发该方法?使用单元测试从源类执行特定的方法

例如:

public class A {   
    @Annotation 
    public void fooA() { } 

    public void fooB() { } 
} 

我的单元测试类:

public class TestA { 
    ... 
} 

在这种情况下,当我跑我的单元测试类种皮,我想执行fooA()和fooB( )

但是,如果我想运行包含classA的prod源代码,那么只有函数将执行fooB(),而不是fooA()

+1

不遵循它的推理。你不应该在意这个环境。如果测试需要一些特殊的环境 - 让它们为自己设置。 – amit

+0

那么这个“设计测试”? 'fooA()'只公开,所以你可以称它为测试工具的一部分?本质上它应该是一种私人方法,但你必须公开它,以便测试它。 – markspace

+0

你为什么要浪费精力测试一些甚至没有包含在软件生产版本中的东西? – Michael

回答

3

一般:不要去那里。

您的产品代码有一个责任;只有一个责任:做生产工作。您不考虑复杂测试相关方面。

有时,可能需要或有帮助有一个构造函数需要更多参数(用于依赖注入)。然后,只要让这个东西包受到保护,并在那里放一个非正式的“/ **单元测试* /”评论。

我的意思是:没有这样的注释。而且它也没有意义。你用清晰的javadoc描述你的外部接口,你编写你的类,使它变成明显,用户应该只使用/调用fooB()

问题是:你想要发生的最后一件事是代码中的一些仅测试工件会在生产环境中导致问题。避免这种风险的最佳方法是:不要创建这样的工件。

+0

你是;欢迎; – Michael

+0

对不起,你们不懂这个笑话:p –

+0

你的回答很有道理。我的想法陷入了无限循环。重构逻辑prod代码是要走的路! :P –

0

您可以将您的测试包声明为与被测单元(UUT)相同。

package com.example.fubar.arglebargle; 
public class A { 
    // package-private, TEST ONLY! 
    void fooA() { } 

    public void fooB() { } 
} 

的单元测试类:

package com.example.fubar.arglebargle; 
public class TestA { 
    // etc... 
} 

我的IDE和JUnit测试自动执行此操作。我的所有测试都与我的UUT在同一个包中声明(尽管它们显然是在完全不同的源代码树中;不要将测试和生产源放在同一个子目录中!)。

这对于访问一些内部不可用的内部组件很方便。这似乎也是标准做法,所以我认为没有任何反对的做法。

这不会阻止每个人呼叫fooA(),但它会限制潜在的问题,以类与你的班级相同的包。这是一小部分需要担心的代码,通常您可以依赖修改代码的人仔细阅读同一包中其他类中的注释。我认为一些测试框架可能能够访问私有方法(也许可以通过禁用安全管理器?),但我不知道离手。如果这很重要,我会研究测试框架。

0

为什么仅用于测试的代码应该可用于生产?

1)它不验证应用程序代码,因为应用程序不使用它。

2)使用它的类的客户端容易出错。

3)它增加了代码的可维护性和可读性。
例如,开发人员可能会想知道为什么此方法在应用代码中没有调用者时存在。 考虑到它是死代码,他可以删除该方法并删除使用它的单元测试。

为了解决您的问题,我认为非生产环境中需要的这种方法应该包含在非生产环境中的应用程序包装中,但应该从生产环境中的包装中排除。
作为Maven和Gradle的工具很好地处理了这个需求。

实际上,您不能这样做,因为该方法构成生产中所需的类的一部分。所以,第一步就是在特定的类中提取用于测试目的的方法。
以这种方式,过滤它是可能的。

相关问题