2017-01-31 32 views
1

現状では厄介なレガシープロジェクトに取り組んでいます。私が修正したものにユニットテストを追加して嬉しいです。ユニットテスト、メソッドパラメータを変更する必要があります

public abstract class AbstractYYY extends XX { 

    private LoginDTO selectedLogin; 
    private Tab tab; 
    private GenericJobDTO job; 



    @Override 
    public void action() throws TabException { 
    JobContainerDTO jobContainer = tab.getRoot().getData(); 

    jobContainer.setUser(tab.getUsername()); 
    jobContainer.setServer(tab.getConnectorURL()); 
    jobContainer.setPlatform(tab.getPlatform()); 
    jobContainer.setLoginID(selectedLogin.getId()); 

    if (jobContainer.getApp().equals(App.TEST)) { 
     if (job instanceof JobDTO) { 
      ((JobDTO) job).setLoginId(selectedLogin.getId()); 
      ((JobDTO) job).setZoneId(jobContainer.getZoneId()); 
     } 

     if (job instanceof JobAutoDTO) { 
      ((JobAutoDTO) job).setLogin(selectedLogin.getId()); 
      if(selectedLogin.getConnector() != null){ 
       ((JobAutoDTO) job).setConnectorId(selectedLogin.getConnector().getId()); 
      } 
     } 
    } 


    if (jobContainer.getStatus() != 1) { 
     jobContainer.setLastRunStartTime(0); 
     jobContainer.setLastRunEndTime(0); 
     jobContainer.setLog(""); 
    } 

    job.setId(UUID.randomUUID().toString()); 
    jobContainer.setJobXYZasJSON(job.toJson()); 
    jobContainer.setWorker(job.getWorker()); 
    jobContainer.setId(savedID); 


    if (jobController != null) { 
     jobController.action(); 
    } 

} 

. 
. 
. 
. 

} 
私は私の jobContainerが満たされているかをテストしたいと思いますので、私は

JobContainerDTO setContainerInfo(JobContainerDTO jobContainer、タブタブ...)

のようなメソッドを作成した。しかし、それは私が「という意味

パラメータjobContainerを修正する必要がありますが、これは良い考えではありません。

このメソッドをどのようにテストしますか?

+0

アクションメソッドまたは特定の部分からすべてをテストしますか?どの部分? –

+0

理想的には、私はjobContainerと仕事を満たしたより小さなメソッドを書くことができるようにしたいと思います。アクションメソッドをテストすることができます – Seb

+0

はタブ、selectedLogin、savedID ..インスタンス変数ですか? –

答えて

2

私は2つのヘルパークラスを作成します。

ジョブの充填に特化したjobContainerと他のものを満たすためのもの。

JobContainerResolver

public class JobContainerResolver{ 

    private JobContainer jobContainer; 

    public JobContainerResolver(JobContainer jobContainer){ 
     this.jobContainer = jobContainer; 
    } 

    public void fillWithTabData(Tab tab){ 
     jobContainer.setUser(tab.getUsername()); 
     jobContainer.setServer(tab.getConnectorURL()); 
     jobContainer.setPlatform(tab.getPlatform()); 
    } 

    public void fillWithJobData(Job job){ 
     jobContainer.setJobXYZasJSON(job.toJson()); 
     jobContainer.setWorker(job.getWorker()); 
    } 

    public void fillWithIds(SelectedLogin login, Integer savedID){ 
     jobContainer.setId(savedID); 
     jobContainer.setLoginID(selectedLogin.getId()); 
    } 

} 

JobResolver

public class JobResolver{ 

    private Job job; 

    public JobResolver(Job job){ 
     this.job = job; 
    } 

    public fillWithBasicData(JobContainer, SelectedLogin){ 
     if (jobContainer.getApp().equals(App.TEST)) { 
      if (job instanceof JobDTO) { 
      ((JobDTO) job).setLoginId(selectedLogin.getId()); 
      ((JobDTO) job).setZoneId(jobContainer.getZoneId()); 
      } 

      if (job instanceof JobAutoDTO) { 
      ((JobAutoDTO) job).setLogin(selectedLogin.getId()); 
      if(selectedLogin.getConnector() != null){ 
        ((JobAutoDTO) job).setConnectorId(selectedLogin.getConnector().getId()); 
      } 
      } 
     } 
    } 
} 

アクション()メソッドで

@Override 
public void action() throws TabException { 
    JobContainerDTO jobContainer = tab.getRoot().getData(); 

    JobContainerResolver jcResolver = buildJobContainerResolver(jobContainer); 

    JobResolver jResolver = buildJobResolver(job); 

    jcResolver.fillWithTabData(tab); 
    jcResolver.fillWithJobData(job); 
    jcResolver.fillWithIds(selectedLogin, savedID); 

    jResolver.fillWithBasicData(jobContainer, selectedLogin); 
} 

public JobContainerResolver buildJobContainerResolver(JobContainer jc){ 
    return new JobContainerResolver(jc); 
} 

public JobResolver buildJobResolver(Job job){ 
    return new JobResolver(job); 
} 

この構造体では、別々の設定とaction()メソッド自体を独立してテストできます。あなたはちょっと嘲笑して遊ぶ必要があります。

+0

このようなやり方をして欲しいと思いますが、私はそのようなことをしたいと思いましたが、私のメソッドにjobContainerインスタンスを渡してメソッドパラメータを変更しなければならないと思いました。 しかし、あなたはやっている方がいいと思います。 – Seb

+0

jobContainerにクローンメソッドを追加し、副作用が全くない方が良いでしょうか? – Seb

1

Tab tabフィールドを偽装すると、アサートできるオブジェクトが返されます。

@Mock 
private Tab tab; 

@InjectMocks 
private AbstractYYY testClass = new RealYYY; 

@Test 
public void test(){ 
    JobContainerDTO jobContainer = new JobContainerDTO(); 
    Root mockedRoot = mock(Root.class); 
    when(tab.getRoot).thenReturn(mockedRoot); 
    when(mockedRoot.getData()).thenReturn(jobContainer); 

    testClass.action(); 

    //Here you can assert that JobContainerDTO jobContainer is in the state that you expect it to be. 
} 

GenericJobDTO jobでも同じアプローチが可能です。あなたはそれを嘲笑し、メソッド呼び出しを検証する必要があります。

関連する問題