我正在开发一个带有单元/集成测试的 Java Web 应用程序。应用程序被部署到 Jetty 并在运行 maven 的集成测试阶段时使用 H2 db。我有一个从无法迁移到 H2 db 的 dao 层调用的 oracle 函数,因此我想在运行测试用例时在代码中模拟/跳过这部分。
我想有一个标志可以判断我是否在测试模式下运行应用程序并将条件放入代码中,但对我来说看起来不像更清洁的方法。请建议实现这一目标的最佳方法。
我正在开发一个带有单元/集成测试的 Java Web 应用程序。应用程序被部署到 Jetty 并在运行 maven 的集成测试阶段时使用 H2 db。我有一个从无法迁移到 H2 db 的 dao 层调用的 oracle 函数,因此我想在运行测试用例时在代码中模拟/跳过这部分。
我想有一个标志可以判断我是否在测试模式下运行应用程序并将条件放入代码中,但对我来说看起来不像更清洁的方法。请建议实现这一目标的最佳方法。
将 Oracle 本机调用提取到一个单独的类(可能是某些 DAO)中。将该 DAO 注入到使用它的类中。创建该 DAO 的第二个实现,不做任何事情来代替调用 Oracle。在集成测试期间注入后一种实现。
避免在代码中使用标志。如果您使用的是 Spring,请使用将选择性地创建一个实现或另一个实现的构建配置文件。
这就是依赖注入如何帮助您测试代码:如果您想模拟系统的某些部分,只需注入模拟版本。
如果问题真的是:
在java中进行单元测试时如何跳过一段代码
那么我同意给出的答案。依赖注入、模拟框架绝对是进行真正单元测试的正确方法。
但是,如果问题是:
使用 JUnit(或其他单元测试框架)时如何跳过一段代码
然后我认为答案是“视情况而定”。有时我使用 JUnit 进行集成测试——我在测试服务器上运行的客户端代码片段,以省去通过 GUI 手动执行这些客户端测试的麻烦。在这种情况下,我使用系统属性,例如在我的基类中我有:
protected boolean skipTest()
{
String port = System.getProperty("jersey.test.port");
// don't run this test unless developer has explicitly set the testing properties
// this is an integration test, not a unit test
return port == null;
}
然后在实际的测试类中它看起来像这样:
// verify a successful login
@Test
public void testLogin()
{
if (skipTest())
return;
// do real test
所以,我的想法是,如果你真的不能从你的 DAO 中重构 Oracle 的东西,那么你真的在做一个集成测试,在你的单元测试中有一个 skipTest 是可以的。