Android编写单元测试实用程序方法

时间:2016-08-12 05:19:36

标签: java unit-testing junit

我正在为静态实用程序方法编写单元测试:

public static String getString(Object object, boolean prettyPrint) {
    if (object == null) {
        throw new NullPointerException("Cannot pass null to Utility.getString() method");
    }
    Gson gson;
    if (prettyPrint) {
        gson = new GsonBuilder().setPrettyPrinting().create();
    } else {
        gson = new Gson();
    }
    return gson.toJson(object);
}

这是单元测试:

@Test 
public void getString() throws Exception {
    JokeItem item = new JokeItem("title", "joke");
    String required = new Gson().toJson(item);
    String actual = Utility.getString(item, false);
    Assert.assertEquals(required, actual);
    String required1 = "{\"joke\":\"joke\",\"title\":\"title\"}";
    String actual1 = Utility.getString(item, false);
    Assert.assertEquals(required1, actual1);
}

JokeItem是一个简单的pojo类。我面临的问题是,我不确定我的测试用例是否是正确的方法来测试此方法,因为我基本上在这两种方法中使用相同的方法gson.toJson(object)。如果我能得到它将会非常有用在测试这种功能以及我的方法中存在的缺陷和不足之处的一些见解。

2 个答案:

答案 0 :(得分:3)

单元测试Gson没有意义 - 它已经由作者测试过了 由于您的方法非常简单,我会说只有在传递null对象时抛出if时才应测试并检查第一个NullPointerException语句。
如果您想创建更强大的测试,我建议您检查与GsonGsonBuilder的互动,以验证是否已调用了正确的方法。但这需要监视两个对象。

答案 1 :(得分:3)

测试这样的方法实际上非常简单 - 您创建了一系列使用特定输入调用方法的测试;然后你检查回来的东西。像:

@Test(expected=NullPointerException.class)
public testCtorWithNullStringAndTrue() {
  Whatever.getString(null, true);
}
// same for false

// and then
public testSomeInput() {
  assertThat(Whatever.getString("whatever", true), is("expected-json-string"));
} // same for false ...

正如马雷克所指出的那样,你可能不会需要更多的东西。你不应该开始Gson实现。

但是:你肯定想在你的方法中测试所有可能的路径;在你的情况下,你只是想确保你得到一些固定输入的预期输出(包括所有不同类型的"无效"输入!)。

最后,关于代码质量:很容易将这样的小助手写成静态方法;并使用布尔值作为参数, ...这不是一个好的OO设计。考虑一下:

interface JsonBuilder {
   String getString(Object input);
}

class SimpleBuilder implements JsonBuilder 
// does what your "non-pretty print code" does

class PrettyBuilder implements JsonBuilder
// does the other thing

而不是担心使用真/假;并且紧密将该静态方法的用户与实现相结合(以后很难分解);你可以传递JsonBuilder接口的对象。 而且你的代码只调用一种方法,而不用担心。

这里可能有些过分,但仍然值得思考。