2017-08-17 9 views
0

私はJava Springベースのライブラリを作成しています。私は彼らのためにjunitテストを書いた。私の問題は、豆が印刷されても、正しくオートワウドされていないことです。それらはnullです。春の自動ワイヤリングが正しく動作しない

ここにコードがあります。ここで

@Test 
public void test() { 
    System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); 

    try{ 
    DBClient dbClient = new DBClient(); 
    dbClient.doSomething(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

私のdbclientコードです:、 [org.springframework.context.annotation.internalConfigurationAnnotationProcessor:

@Autowired 
@Qualifier("UserActivityRepositoryService") 
private UserActivityRepositoryService userRepositoryService; 

public void doSomething() { 
    System.out.println("Inside db client. Getting the count"); 
    System.out.println(this.userRepositoryService.count()); 
} 

これは、ここに私のUserRepositoryServiceクラスコード

@Service 
@Qualifier("UserActivityRepositoryService") 
public class UserActivityRepositoryService implements IRepoClient<UserActivity>{ 

private UserActivityRepository repo; 

@Autowired 
public void setUserActivityRepository(UserActivityRepository repo) { 
    this.repo = repo; 
} 

public void create(UserActivity userActivity) { 
    repo.save(userActivity);   

} 

@Override 
public UserActivity save(UserActivity entity) { 
    // TODO Auto-generated method stub 
    System.out.println("Creating the documenht"); 
    try{ 
    repo.save(entity); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    System.out.println("userActivity" + entity); 
    return null; 
} 

@Override 
public Iterable<UserActivity> save(Iterable<UserActivity> entities) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public UserActivity findOne(String id) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public boolean exists(String id) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public Iterable<UserActivity> findAll() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public Iterable<UserActivity> findAll(Iterable<String> ids) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void delete(String id) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void delete(UserActivity entity) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void delete(Iterable<? extends UserActivity> entities) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void deleteAll() { 
    // TODO Auto-generated method stub 

} 

@Override 
public long count() { 
    // TODO Auto-generated method stub 
    return 0; 
} 
} 

である私の出力でありますプロパティ。 R、org.springframework.context.annotation.internalCommonAnnotationProcessor、org.springframework.context.event.internalEventListenerProcessor、org.springframework.context.event.internalEventListenerFactory、myCouchbaseConfig、integrationTestConfig、org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor、ORG。 springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor、CBRepoFactory、repoFactoryBuilder、設定、userActivityRepositoryService、couchbaseBucket、couchbaseCluster、couchbaseClusterInfo、couchbaseEnv、couchbaseTranslationService、couchbaseIndexManager、couchbaseMappingConverter、couchbaseTemplate、couchbaseRepositoryOperationsMapping、couchbaseMappingContext、couchbaseCustomConversions、org.springframework.data.couchbase.repository。 config.CouchbaseRepositoryConfigurationExtension#0、userActivityRepository] ​​ java.lang.NullPointerException Insiデブクライアント。カウントを取得する

私が間違っていることを誰にでも教えてもらえますか?

+0

UserActivityRepositoryServiceコード –

+0

を共有してくださいはUserActivityRepositoryService – surya

+0

https://stackoverflow.com/questions/19896870/のコードを更新しましたなぜ私の春のautowiredフィールドnull – Reimeus

答えて

3

クラシックスプリング初心者ミス。私はそれを何千回も見た。

あなたはクラスDBClientをautowiredしました。これは、Springがすべての依存性注入を処理することを期待しています。

は、その後、あなたがnewを呼び出すことで、独自のインスタンスをインスタンス化します。

DBClient dbClient = new DBClient(); 

あなたがnewを呼び出すと、それはSpringのコントロールの外です。ここには自動配線はありません。UserActivityRepositoryServiceはnullです。

あなたが選択する必要があります:すべての春のコントロールを与えるか、あなたがそれを行う。

テストしている場合は、mockを使用してJUnitテストからSpringを離れることをおすすめします。

ゲッター/セッターにコンストラクタインジェクションを使用することをお勧めします。そうすれば、単体テストを書くときのように、必要なときにコードで実行できます。

データサービスを作成しようとしているようです。あなたのフレームワークを忘れてSpring Bootを使うことをお勧めします。それはすでにdoes thisです。あなたは(duffymoはすでに言ったように)このようなあなたのテストを変更する必要が

+0

を理解しています。私はライブラリを書いています。インタフェースは単なるファクトリであり、Beanのautowiredインスタンスを返すべきです。それ、どうやったら出来るの? – surya

+0

Spring Beanファクトリがすでに利用可能になっているときに、なぜ工場を作成していますか?フレームワークでフレームワークをラッピングしていますか? – duffymo

+0

これがなぜ落とされたのか想像できません。誰がそれを気にして、理由を説明するのだろうか? – duffymo

0

@Autowired 
private DBClient dbClient; 

@Test 
public void test() { 
    System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); 

    try{ 
     dbClient.doSomething(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
+0

これは、Springがテストをautowireに設定されている場合にのみ機能します。これはたりない。 – duffymo

+0

suryaはapplicationContextにアクセスできるので、テストはすでに '@RunWith(SpringRunner.class)'で構成されていると思います。与えられた不完全なコード断片では、テストで何が与えられ、何が欠けているか見ることはできません。 – flexguse

+0

私はsuryaがautowiringのしくみを理解していないので、最悪の場合を想定します。 – duffymo

関連する問題