Java service method only for test

时间:2016-05-17 11:13:11

标签: java service interface

Is there a way to use a service method (a method that is implemented in the service layer (Interface) ) only in test classes?

in my service interface i have a method that i want to use it only in test class and prevent or show some warning to other developers that doesn't use it in their managerImpl or other palace such as controller

4 个答案:

答案 0 :(得分:2)

让我们准确地说一下措辞:

如果您真的在谈论Java 接口的方法;那么Java8将允许您提供一个可能引发异常的默认实现;然后你有非常具体的类来实现这个接口,并且可能会覆盖那个方法用于测试目的。

如果你在谈论"接口"一般来说;例如"某些类的方法列表" ...然后这种"基地投掷"和"孩子覆盖"也可以。

当然,第一个答案可能就是可见性本身。如果我们谈论真实的界面;你至少可以使方法包受到保护;然后使用仅限于同一个包。

另一种选择是关注ISP隔离您的界面。如果有什么东西只能用于"测试&#34 ;;然后考虑把这些东西放到一些" TestSupportInterface&#34 ;;或类似的东西。

但又一次;大多数这些想法都按照惯例运作&#34 ;;通过提供用户必须消化的某种信息......但不能强制执行。

最后:您可以考虑更改生产代码。通常,您可能不需要这样的特殊测试吸气剂"。换句话说:如果您的测试工作类似于"获取X的状态。使用X执行某些操作。再次获取X的状态并比较"。有时候这可以改为基于行为的测试(你不会检查X会发生什么;但是你要检查X对Y,Z做什么......)。

答案 1 :(得分:0)

No, there's no concept in Java to warn developers about using methods.

Rethink if you 'really' need such a method, or if you could change your design to not require such a back door. (e.g. utilize the power of dependency injection). From my experience this is always possible.

If you are still convinced that you want this method implement it in your test code (e.g. by subclassing), not in production code.

答案 2 :(得分:0)

通常最好不要在生产代码中添加“仅用于测试”。

您可以创建专用于所有用户抑制的服务,并将其放在测试类路径中。 根据您的实现,此服务可能是生产用户服务的子类。

答案 3 :(得分:0)

除了其他好的答案之外:如果您确实需要一个方法来调试测试用例而不是生产代码,那么您可以使用此方法private。因此,除非有人更改可见性,否则没有人会使用此方法在您的测试用例中,您可以通过PrivateAccessor调用它。

但要小心:这通常被认为是代码气味。对于您的IDE,这是一个私有且未使用的方法,因此会出现警告消息。其他人可以因此而删除此方法。