2017-11-13 4 views
0

私は現在、ユーザーがカテゴリをデータベースに保存できるようにするSpring起動アプリケーションを開発中です。私は自分のコードを "仕事"にすることができますが、私はそれが私がすることができるテストの量を制限していると思うので、私の質問です。(Spring)ループ内で依存関係注入を使用できますか?

コントローラはカテゴリのリストを受信します。コントローラーはこれらのカテゴリーを反復して検証し、有効かどうかによってデータベースに保存されます。コントローラは、最終的に受信者がどのカテゴリが受け入れられたか拒否されたかを識別できるようにメッセージのリストを返します。

私はモデルメッセージ(リスト)のリストを持っており、各繰り返しでコントローラはモデルメッセージ(new ModelMessage())を呼び出し、最終的にそれをListに追加します。 各繰り返しで新しいModelMessageを挿入する方法はありますか?または新しいキーワードを使用する必要がありますか?新しいキーワードを使用すると、私のテスト能力が制限されている/コントローラをモデルメッセージに強く結合しているように感じられます。

コントローラ:

@PostMapping("/category") 
    public String saveCategoryModelToDatabase(@RequestBody CategoryModelWrapper categoryModelWrapper){ 
     List<CategoryModel> categoryModelList = categoryModelWrapper.getCategoryModelList(); 
     modelMessageList.clear(); 

     for(CategoryModel categoryModel : categoryModelList){ 
      //Resetting model 
      modelMessage = new ModelMessage(); //This tightly couples my method to the ModelMessage class, which is bad for testing? 
      //@Autowired modelMessage; <-- something like this? Inject a new ModelMessage with each iteration. 
      modelMessage.setName(categoryModel.getName()); 

      //Resetting categoryModelErrors 
      Errors categoryModelErrors = new BeanPropertyBindingResult(categoryModel, "categoryModel"); 
      categoryModelValidator.validate(categoryModel, categoryModelErrors); 


      if(categoryModelErrors.hasErrors()){ 
       modelMessage.setStatus(ModelMessageStatusEnum.REJECTED); 
       modelMessage.setReason(MODEL_MESSAGE_0004); 
      } 

      if(categoryModelService.save(categoryModel)){ 
       modelMessage.setStatus(ModelMessageStatusEnum.ACCEPTED); 
      } 
      else{ 
       modelMessage.setStatus(ModelMessageStatusEnum.REJECTED); 
       modelMessage.setReason(MODEL_MESSAGE_0005); 
      } 
      modelMessageList.add(modelMessage); 
     } 

     return gson.toJson(modelMessageList); 
    } 

受信者への応答の例:任意の助け:)

+0

検索 'スコープ= "プロトタイプ"'。それは春の特徴です。 – Stewart

+0

なぜコントローラ内にModelMessageを作成するのが悪いと思いますか?基本的には、コントローラやサービスクラス(厳密な結合が実際にはテストに悪い)についてではなく、ここで返されるデータについて話しています。メソッドをテストする場合は、入力パラメータを指定し、適切なModelMessagesがレスポンスの一部であるかどうかを確認します。私が見た最も簡単な方法の一つです。 – dunni

答えて

1

ため

[{"name":"Arts","status":"ACCEPTED"},{"name":"Business","status":"ACCEPTED"},{"name":"Gaming","status":"ACCEPTED"},{"name":"Deals","status":"REJECTED","reason":"Category rejected because of an unexpected exception, i.e. possibly due to duplicate keys."}] 

おかげであなたがアクセス権を持っていると仮定して、ApplicationContextのを使用することができますそれをModelMessageのファクトリとして使用します。しかし、それは本当に必要ですか?

0

あなたはコントローラで新しいModelMessagesを作成できます。これはデータオブジェクトでありサービスBeanではないと思います。 junitはメソッドの結果を確認できます。

あなたは本当に春を使用する場合でも、私はFactoryBeanのを見てしまう...

例:

public class ModelMessage { 
    String name; 
    public String getName() { 
    return name; 
    } 
    public void setName(String name) { 
    this.name = name; 
    } 
} 

@Component 
public class ModelMessageFactory implements FactoryBean<ModelMessage> { 

    @Override 
    public ModelMessage getObject() throws Exception { 
    return new ModelMessage(); 
    } 

    @Override 
    public Class<?> getObjectType() { 
    return ModelMessage.class; 
    } 
} 

@RunWith(SpringRunner.class) 
@SpringBootTest 
@SpringJUnitConfig 
public class ModelMessageFactoryTest { 

    @Autowired 
    private ModelMessageFactory messageFactory; 

    @Test 
    public void testGetObject() throws Exception { 

    assertNotNull("Factory is null", messageFactory); 
    IModelMessage modelMessage1 = messageFactory.getObject(); 
    IModelMessage modelMessage2 = messageFactory.getObject(); 

    assertNotEquals("error object is equal", System.identityHashCode(modelMessage1), 
     System.identityHashCode(modelMessage2)); 
    } 

    @Test 
    public void testGetObjectType() throws Exception { 
    assertEquals(ModelMessage.class, messageFactory.getObjectType()); 
    } 
} 
関連する問題