2017-07-31 19 views
1

IoCと0ユニットテストを使用していない15歳のレガシープロジェクトにユニットテストコードカバレッジを追加するように割り当てられました。私は、などdoNothingメソッドはvoid静的メソッドでは機能しません

ServiceクラスはperformService方法は、コード

public void performService(requestMessage, responseMessage) { 
     UserAccount userAccount = requestMessage.getUserAccount(); 
     GroupAccount groupAccount = requestMessage.getGroupAccount(); 
     Type type = requestMessage.getType(); 
     StaticServiceCall.enroll(userAccount, groupAccount, type); 
     response.setStatus(Status.SUCCESS); 
} 
次ましたあり、経営者は他のチームがQAテストのようなリファクタリングのために巻き込まれたくない、それは生産上の完璧な罰金を動作しますので、コードをリファクタリングすることは許されないのです

このStaticServiceCall.enrollメソッドは、リモートサービスを呼び出しています。私のユニットテストは、EclipseがThe method when(T) in the type Stubber is not applicable for the arguments (void)

Eclipseの停止と訴える

@RunWith(PowerMockRunner.class) 
@PrepareForTest(StaticServiceCall.class) 
public class EnrollmentServiceTest { 

@Test 
public void testPerformService() {  
    mockStatic(StaticServiceCall.class); 
    doNothing().when(StaticServiceCall.enroll(any(UserAccount.class), any(GroupAccount.class), any(Type.class))); 
    service.performService(requestMessage, responseMessage); 
    assertEquals("Enrollment should be success, but not", Status.SUCCESS, response.getStatus); 
} 

mockStatic(StaticServiceCall.class); 
doNothing().when(StaticServiceCall.class); 
StaticServiceCall.enroll(any(UserAccount.class), any(GroupAccount.class), any(Type.class)); 
service.performService(requestMessage, responseMessage); 
assertEquals("Enrollment should be success, but not", Status.SUCCESS, response.getStatus); 

テストケースにテストコード変更した場合UnfinishedStubbingExceptionで失敗しました文句です。私はpowermockを使用しています1.6.6

答えて

2

あなたの最後に誤解があります。あなたは、doNothing()は何もしないと言わなければならないと考える。

これは必須ではありません。これらの線として

@PrepareForTest(StaticServiceCall.class) ... and 
mockStatic(StaticServiceCall.class); 

はすでに十分です。

テスト中にメソッドが呼び出されたときに、その静的メソッドの "本当の"内容が実行されないようにします。そしてそれがmockStatic()のことです。言い換えれば

:あなたはmockStaticを使用するとすぐに()実際のクラスの完全実装があるを拭い。何か起こりたい場合に備えて、when/then/doReturn/doThrowを使用する必要があります。else以外

意味:doNothing()行全体を削除してください!

1

@GhostCat - あなたの答えをありがとう、それは私の誤解がここ

@Test 
public void testEnrollmentServiceSuccess() { 
    RequestMessage requestMessage = new RequestMessage(); 
    requestMessage.setName("ENROLL"); 
    ResponseMessage responseMessage = new ResponseMessage(); 

    EnrollmentService mockService = mock(EnrollmentService.class); 
    mockService.performService(any(RequestMessage.class), any(ResponseMessage.class)); 

    mockStatic(ClientManager.class); 
    when(ClientManager.isAuthenticated()).thenReturn(true); 

    ServiceImpl service = new ServiceImpl(); 
    service.performService(requestMessage, responseMessage); 
    verify(mockService).performService(any(RequestMessage.class), any(ResponseMessage.class)); 
} 

このテストケースから来て、問題を解決には、異なるサービスクラスを呼び出すリクエストメッセージのServiceImplクラスベースの名前のコードスニペットです

public void performService(RequestMessage request, ResponseMessage response) { 
    try { 
     if (request == null) { 
      throw new InvalidRequestFormatException("null message"); 
     } 
     if (!ClientManager.isAuthenticated()) { 
      throw new ServiceFailureException("not authenticated"); 
     } 
     // main switch for known services 
     if ("ENROLL".equals(request.getName())) { 
      service = new EnrollmentService(); 
      service.performService(request, response); 
     } else if ("VALIDATE".equals(request.getName())) { 
     ... 

テストは、合格EnrollmentServiceにおける実際の実装が呼ばれましたし、原因ベアボーンの要求メッセージオブジェクトに例外がスローされますが、その後、私はあなたのclarificaのためにもう一度、感謝をdoNothingをGoogleで検索

関連する問題