web-dev-qa-db-ja.com

環境インターフェースをどのようにモックしますか?

私は次のようなサービスをテストしようとしています:

import org.springframework.core.env.Environment;

@Service
public class MyService {
@Autowired Environment env;
...
...
}

環境インターフェースをモックする方法、または環境インターフェースを作成する方法を教えてください。

12
storm_buster

Springは、プロパティソースと環境にモックを提供します。これらは両方とも、org.springframework.mock.envモジュールのspring-testパッケージにあります。

  • MockPropertySource:Spring Framework3.1以降で使用可能--- Javadoc
  • MockEnvironment:Spring Framework3.2以降で使用可能--- Javadoc

これらは、テストの章の モックオブジェクト セクションのリファレンスマニュアルに簡単に記載されています。

よろしく、

サム

17
Sam Brannen

Mockitoを使用すると、以下のコードのように実行できるはずです。実行時にEnvironmentフィールドを設定できるように、アクセサーを提供する必要があることに注意してください。または、自動配線されたフィールドが2つしかない場合は、環境を挿入できるコンストラクターを定義する方が簡単です。

import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;

public class MyServicetest {

    // Define the Environment as a Mockito mock object
    @Mock Environment env;

    MyService myService;

    @Before
    public void init() {
        // Boilerplate for initialising mocks 
        initMocks();

        // Define how your mock object should behave
        when(this.env.getProperty("MyProp")).thenReturn("MyValue");

        // Initialise your service
        myService = new MyServiceImpl();

        // Ensure that your service uses your mock environment
        myService.setEnvironment(this.env);
    }

    @Test
    public void shouldDoSomething() {
        // your test
    }

}
2
Steve

実装クラスには@AutowiredEnvironmentenvがあります。したがって、> JUnitテストケースを実行している場合、実装クラスには次のようなコンストラクターが必要です。

public class SampleImpl{
@Autowired
Environment env
public SampleImpl(Environment envObj){
this.env = envObj}
}

jUnitテストクラスは次のようになります。

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.springframework.core.env.Environment;
import static org.mockito.Mockito.when;
public class SampleTest {   

     @Mock Environment env;

     @Before
      public void init(){
          env = mock(Environment.class);     
          when(env.getProperty("file.location"))
            .thenReturn("C:\\file\\");        
      }

          @Test
          public void testCall()throws Exception{
              SampleImpl obj = new SampleImpl(env);
              obj.yourBusinessMethods();

          }
}

お役に立てれば。スティーブに感謝します。

2
KarthikDev

Springベースのテストでは、次のものを使用できます。_@ActiveProfiles_プロファイルをアクティブ化する(ただし、これはモックではありません)

_@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test.xml")
@ActiveProfiles("myProfile")
public class ProfileTest {

  @Autowired
  MyService myService

  @Test
  public void demo() {
      assertTrue(myService.env.acceptsProfiles("myProfile"));
  }
}
_

しかし、私はあなたがモックを必要とし、それからあなた自身を書くか、モックフレームワーク(MokitoまたはJMock)を使用します。 EnvironmentにはサブラスAbstractEnvironmentがあり、customizePropertySources(MutablePropertySources propertySources)メソッドをオーバーライドする必要があります

_@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
            Properties properties = ....
    propertySources.addLast(new MockPropertySource(properties));
}
_
1
Ralph