在下面的示例中,我想测试给定的源,是否构建了正确的 JSON 并将其映射到返回的对象中。起初,代码在其中创建了新的对象,如下所示:
@Override
public Map<String, Object> getAttributes( Source source, Response response )
{
Objects.requireNonNull( response, "response can not be null" );
final Map<String, Object> attributes = new HashMap<>( );
final JSONArray users = new JSONArray( response.getEntityContentAsString( ) );
final Set<String> mappedUsers = new HashSet<>( );
for ( int i = 0; i < users.length( ); i++ )
{
mappedUsers.add( users.getJSONObject( i ).getString( "name" ) );
}
attributes.put( "mappedUsers", mappedUsers );
return attributes;
}
但它有问题,首先,我不想使用 PowerMock 或其他反射实用程序来模拟新对象的创建。但是要测试这段代码;
我必须在response.getEntityContentAsString( )中返回正确的 JSON ,因为我没有模拟 JSONArray,它应该创建正确的对象。这意味着每次我只想测试此代码行为时,我都必须修改此“虚拟”json。我必须在对象内添加“名称”属性,或者我必须使其长度适合循环。
为了防止这种情况,我想介绍工厂内的新对象创建。现在:
@Override
public Map<String, Object> getAttributes( Source source, Response response )
{
Objects.requireNonNull( response, "response can not be null" );
final Map<String, Object> attributes = new HashMap<>( );
final JSONArray users = jsonArrayFactory.create( response.getEntityContentAsString( ) );
final Set<String> mappedUsers = new HashSet<>( );
for ( int i = 0; i < users.length( ); i++ )
{
mappedUsers.add( users.getJSONObject( i ).getString( "name" ) );
}
attributes.put( "mappedUsers", mappedUsers );
return attributes;
}
在我的测试中,我可以模拟它而不是处理与 JSONArray 类一起正常工作的自定义 JSON。此外,我不必处理 JSONArray 的实现,因为我对函数的库细节不感兴趣。但是现在它似乎过度设计了,因为有很多这样的情况;JSONArray、JSONObject、JSONString等直接在创建的项目中。现在团队觉得他们必须创建所有这些工厂 JSONArrayFactory、JSONObjectFactory 等。
在这个例子中你会做什么?也许我们应该改变我们测试功能的方式?您如何处理新对象的创建并防止第 3 方的实现细节?
宝慕林4294392
相关分类