2013-07-12 103 views
2

我用的球衣,我有以下的休息函數返回時,我的服務器部署一個JSON字符串:呼叫一個休息法的Mockito

@GET 
@Path("getallemployees") 
@Produces("application/json") 
public Response getAllEmployees() { 
//building the entity object which is List<Employee> 
return Response.ok(entity).build(); 
} 

我需要開發一些單元測試(不集成測試)和我想以某種方式模擬調用此方法的HTTPRequest,然後獲取json字符串。最好的選擇是爲此使用mockito。

有沒有關於如何做的建議?

謝謝!

回答

1

問題是該方法返回一個Response對象到深層框架代碼中的調用者。它不返回JSON字符串。

如果你需要在方法本身內部嘲弄某些東西,你可以使用Mockito。這應該工作。

但是,如果您在Jersey中使用Jackson,您可能需要採用該方法返回的值並將其轉換爲JSON。

Response response = getAllEmployees(); 
Object retval = response.getEntity(); 
try { 
    ObjectMapper mapper = new ObjectMapper(); 
    // I like this formatting. You can change it. 
    mapper.configure(Feature.INDENT_OUTPUT, true); 
    mapper.configure(Feature.WRITE_ENUMS_USING_TO_STRING, true); 
    mapper.configure(Feature.USE_ANNOTATIONS, false); 
    mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false); 
    mapper.setSerializationInclusion(Inclusion.NON_NULL); 
    mapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); 
    mapper.getSerializationConfig().withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); 
    String json = mapper.writeValueAsString(retval); 
    ... assert something about the string 
} catch (JsonProcessingException e) { 
    // do something 
} catch (IOException e) { 
    // do something 
} 
+0

哪個傑克遜版本給你用這個?因爲Feature.INDENT_OUTPUT不被識別... – SteveSt

+0

傑克遜版本1.9.4 –

+0

嗯,這實際上工作:),唯一的問題是,我得到整個實體對象爲JSON字符串,它看起來像這樣:'{「rawType」 : 「的java.util.ArrayList」, 「類型」:{ 「actualTypeArguments」:[ 「dev.entities.Employee」], 「rawType」:「java.util中。列表「},」實體「:[{」idEmployee「:0,」name「:」theName「,」surname「:」theSurname「}' 而原始的json看起來像這樣: ''employee':[ {「idEmployee」:0,「name」:「theName」,「surname」:「theSurname」}' – SteveSt

1

一些,這是猜測和炒作我的一部分,但它可能會有所幫助。你可以嘗試使用Jersey Test FrameworkInMemoryTestContainerFactory

它始於新澤西的應用和直接調用內部API來處理由測試框架提供的客戶端創建請求。沒有涉及網絡通信。這個容器不支持servlet和其他容器相關的功能,但它是簡單單元測試的完美選擇。

它看起來像使用它,你需要做的是延長JerseyTest,然後覆蓋getTestContainerFactory()和遵循的其他說明,如:

public class EmployeeResourceTest extends JerseyTest { 
    @Override 
    protected Application configure() { 
     // set up employee resource with mock dependencies etc... 
     return new ResourceConfig().registerInstances(employeeResource); 
    } 

    @Test 
    public void getAllEmployees() { 
     final String response = target("getallemployees").request().get(String.class); 
     // assert etc... 
    } 
} 

configure()使用registerInstances代替registerClasses因爲它看起來像你可以提供一個現成的Resource,但設置任何模擬依賴你可能需要 - 雖然我沒有嘗試過這個我自己。

測試類有點不靈活,因爲您只能在configure()方法中一次性設置依賴關係,因此可能需要使用MockitoJUnitRunner進行調查 - 儘管我不確定它是否可以與JerseyTest繼承。它可以讓你做每一@Test方法添加行爲嘲笑,例如:

@Mock 
    private EmployeeResourceDependency dependency; 

    @InjectMocks 
    private EmployeeResource employeeResource; 

    // configure() as above but without mock setup up etc... 

    @Test 
    public void getAllEmployees() { 
     given(dependency.getEmployees()).willReturn(...); 

     // etc... 

但是就像我說可能不可能將他們在所有混合。