【问题标题】:How to unit tests method returning Java string?如何对返回Java字符串的方法进行单元测试?
【发布时间】:2014-12-27 13:54:16
【问题描述】:

嗨,我有很多方法可以返回我需要进行单元测试的字符串。现在对我来说挑战是如何进行代码覆盖?例如我的方法如下所示

Public String getSqlToDoXYZ(Myconfig config) {
StringBuilder sb = new StringBuilder() ;
sb.append(  "SELECT BLAH BLAH");
sb.append("WHERE ABC="+config.getABC());
return sb.toString() ;
} 

请给出您的想法如何对这种场景进行单元测试?我正在使用 mockito 进行单元测试。我对模拟和单元测试都是新手,请指导。提前致谢。

【问题讨论】:

  • 附带说明,您应该真正使用准备好的语句,而不是将参数连接到 SQL 中。
  • 您好,感谢您的意见。我不能使用准备好的语句,因为所有这些都是固定查询,并且在运行时会发生变化,最重要的是它们是普通的 sql,不应该作为准备好的语句执行。
  • 您可以在运行时更改语句(参见“为 PreparedStatement 参数提供值”部分),这将帮助您避免 SQL 注入。

标签: java unit-testing mockito junit4


【解决方案1】:

正如其他地方所指出的,在 SQL 注入方面,对 SQL 语句使用字符串是危险的。 话虽如此,您只需调用该方法,并将结果与​​您“手动”构建的字符串进行比较:

public void testBuildSqlToDoXYZ() throws Exception {

   WhateverYourObjectIs yourObject = new WhateverYourObjectIs();
   MyConfig myConfig = new MyConfig();
   myConfig.setABC("foo");

   String sql = yourObject.getSqlToDoXYZ(myConfig);
   assertEquals("SELECT BLAH BLAH WHERE ABC='foo'", sql);

}

只有在您无法手动创建“MyConfig”对象的情况下,Mockito 才会有帮助。

您的代码中可能存在其他问题,但您并未真正向我们提供足够的信息。

【讨论】:

  • 您好,感谢您的回答。 Sql 更加棘手和冗长,我只是举了一个简单的例子,它涉及很多复杂的连接等。我不认为 SQL 注入的风险,因为我的桌面应用程序将在安全防火墙下运行。所以你说的是我的 sql 是什么我应该提前知道并在断言中验证它。
  • 是的,这就是单元测试的一般思想:你得到一个代码单元以使用已知的输入来执行,然后你将“实际”结果(您的测试代码返回的结果)与“预期”进行比较" 结果(你知道的那个。)如果是字符串,实际上很容易,因为 Java 内置了比较。当难以构建输入或需要测试具有无法模拟的副作用的代码时,模拟很有帮助。当您对单元测试更加熟悉时,请参阅martinfowler.com/articles/mocksArentStubs.html 了解更多更多详细信息。
【解决方案2】:

我看不出测试返回字符串的方法有什么困难。

public void testSqlToDoXYZ()
{
 MyObj testTarget = new MyObj(/*Parameters if needed*/);
 Config config = new Config();
 /*Config config = new ConfigMock();*/
 String expectedResult = "SELECT BLAH BLACH WHERE ABC=123;";
 assertEquals(epxectedResult, testTarget.getSqlToDoXYZ(config));
}

关键是你必须知道你的结果。如果config.getABC() 调用可能返回不同的值,您必须确保它始终为您的测试提供相同的值。因此,您可能不得不模拟您的 config 对象或将虚假数据放入您的配置提供程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2016-10-18
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多