2017-06-22 12 views
0

テストユニットを起動して実行しようとしていて、奇妙な問題が発生しました。私のアプリケーションは、起動時に操作を実行するために@Componentとして注釈が付けられたApplicationListenerクラスを使用します。テスト中にSpringブートのApplicationListener @Componentを除外します

テスト中、私はロジックを含むサービスを嘲笑しましたが、Mockitoの命令がコントローラスコープでうまく動作しても、BeanはこのApplicationListenerクラスのために初期化されません。サービスの各メソッドから返されるデータ型に応じて、falseまたはnullのいずれかを返します。

ApplicationListenerクラスのテストユニットから模擬サービスを初期化する方法が見つからないため、除外することにしました。これを行うために、私はテストアプリケーションのコンテキストを作成し、その設定を変更するのに最も頻繁に使用される方法で、さまざまなアプローチを試みました。残念ながら、私が見たことは何も働いていないので、私はここで助けを求めています。可能であれば、私はApplicationListenerクラスに触れず、テストコード内のすべての関連するコーディングを行いたいと考えています。

、彼らが行うことができる場合、私は、2つの解決策のいずれかに興味を持っています:

1.- ApplicationListenerの実行中に嘲笑の挙動を取得しますが、私はこれを行うことができないことをどこかで読んだことが

2.テストユニットから何か@componentを除外します。

TestUnit.Java

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) 
@AutoConfigureMockMvc 
public class TestConfigurationService { 
    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @MockBean 
    private MockService mockService; 

    private void initMockBean() throws Exception { 
     when(mockService.isDoingSomething()).thenReturn(true); 
    } 

    @Before 
    public void setup() throws Exception { 
     // Spring mock context application setup 
     this.mockMvc = webAppContextSetup(webApplicationContext).build(); 

     // Initialize ConsulService mock bean 
     initMockBean(); 
    } 
} 

TestApplication.java

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan(basePackages="my.base.package", excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = StartupConfiguration.class)) 
public class TestApplication { 
    public static void main(String[] args) {  
     SpringApplication.run(TestApplication.class, args); 
    } 
} 

コードに示されているもの以外にも、私はまた、ファイルTestApplication.javaでこの注釈を試してみました:

@SpringBootApplication(exclude={StartupConfiguration.class}) 

StartupConfiguration.java

@Component 
public class StartupConfiguration implements ApplicationListener<ContextRefreshedEvent> { 
    @Autowired 
    private ConfigurationService configurationService; 

    @Override 
    public void onApplicationEvent(final ContextRefreshedEvent event) {  
     try { 
      configurationService.updateConfiguration(); 
     } catch (Exception e) { 
      throw new RuntimeException ("Error", e); 
     } 
    } 
} 

ConfigurationService.java

public interface ConfigurationService { 
    public void updateConfiguration() throws Exception; 
} 

ConfigurationServiceImpl.java

@Service 
@Transactional 
public class ConfigurationServiceImpl implements ConfigurationService {  
    @Autowired 
    private MService mockService; 

    @Override 
    public void updateConfiguration() throws Exception {  
     if (mockService.isDoingSomething()==false) 
      throw new Exception ("Something went wrong"); 
    } 
} 

バージョン

春ブーツ1.5.4.RELEASE、

のJava 1.8

+0

私はあなたが持っている問題についてちょっと混乱しています...テスト中にSpringが 'StartupConfiguration'を初期化したくないという問題はありますか? –

+0

TestのためにStartupConfigurationがロードされていないので、リスナーがまったく実行されないようにする必要があります。 – Rittmann

+0

もう1つの選択肢は、trueを返すようにアプリケーションリスナーを嘲笑するかもしれませんが、起動時に内部mockedサービスがその瞬間に初期化されなかった場合、私の推測では、それを嘲笑することもできません。しかし、それが可能であれば、それはうまくいくでしょう。 – Rittmann

答えて

0

おかげで、araxn1dを。あなたの答えは私にこの問題を解決する手がかりを与えました。私はTestUnit.javaでStartupConfigurationクラス嘲笑

:この場合には

@MockBean 
private StartupConfiguration startupConfiguration; 

もののを私はラッキーだった:アプリケーションリスナメソッドを返す必要はありませんので、彼らは時にテスト構成は必要ありません。そこにいくつかのメソッドがtrueまたは値として返されることを要求した場合、このメソッドは適用されません。

少なくともアプリケーションリスナーの場合は、これで十分です。

0

あなたは、同じタイプのモックBeanを作成し、実際のBeanを置き換えるために@Primary注釈でマークすることができます。あなたは、テストこのような構成を有することにより、これを達成することができます

@Configuration 
@Import(TestApplication.class) 
public class TestConfiguration { 
    @Bean 
    @Primary 
    public ConfigurationService configurationService() { 
     return Mockito.mock(ConfigurationService.class); 
    } 
} 

、その後の試験で、このモックを得る:

... 
public class TestConfigurationService { 
    ... 
    @Autowired 
    ConfigurationService configurationService; 

    @Before 
    public void setUp() { 
     when(mockService.isDoingSomething()).thenReturn(true); 
    } 
} 
+0

それは '@ MockBean'がすでにやっていることです。 Mockitoの '@ Mock'と混同しないでください。 –

+0

@ M.Deinum、うん、私はそれを逃したと私の答えは今では全く価値がない=( – rxn1d

関連する問題