PowerMock を使って System.getenv().get をモック化しようとしています。
テスト対象のクラス:
java
1public class SSOClient { 2 3 private SSOClient() {}; 4 5 public static Keycloak getInstance(){ 6 7 return Keycloak.getInstance(System.getenv().get(SSOConstants.KEY_SERVER_URL), 8 System.getenv().get(SSOConstants.KEY_REALM), 9 System.getenv().get(SSOConstants.KEY_USERNAME), 10 System.getenv().get(SSOConstants.KEY_PASSWORD), 11 System.getenv().get(SSOConstants.KEY_CLIENT_ID), 12 System.getenv().get(SSOConstants.KEY_CLIENT_SECRET)); 13 } 14}
テストクラス:
java
1@RunWith(PowerMockRunner.class) 2@PrepareForTest({Keycloak.class}) 3public class SSOClientTest { 4 5 private static String SERVER_URL = "localhost"; 6 private static String REALM = "realm"; 7 private static String USERNAME = "username"; 8 private static String PASSWORD = "password"; 9 private static String CLIENT_ID = "client_id"; 10 private static String CLIENT_SECRET = "client_secret"; 11 12 @Before 13 public void setUp() throws Exception { 14 15 PowerMockito.mockStatic(Keycloak.class); 16 17 Map<String, String> envMap = new HashMap<>(); 18 envMap.put(SSOConstants.KEY_SERVER_URL, SERVER_URL); 19 envMap.put(SSOConstants.KEY_REALM, REALM); 20 envMap.put(SSOConstants.KEY_USERNAME, USERNAME); 21 envMap.put(SSOConstants.KEY_PASSWORD, PASSWORD); 22 envMap.put(SSOConstants.KEY_CLIENT_ID, CLIENT_ID); 23 envMap.put(SSOConstants.KEY_CLIENT_SECRET, CLIENT_SECRET); 24 PowerMockito.mockStatic(System.class); 25 PowerMockito.when(System.getenv()).thenReturn(envMap); 26 } 27 28 @Test 29 public void testGetInstance() throws Exception { 30 31 Keycloak client = SSOClient.getInstance(); 32 33 PowerMockito.verifyStatic(Keycloak.class, VerificationModeFactory.times(1)); 34 ArgumentCaptor<String> serverUrl = ArgumentCaptor.forClass(String.class); 35 ArgumentCaptor<String> realm = ArgumentCaptor.forClass(String.class); 36 ArgumentCaptor<String> username = ArgumentCaptor.forClass(String.class); 37 ArgumentCaptor<String> password = ArgumentCaptor.forClass(String.class); 38 ArgumentCaptor<String> clientId = ArgumentCaptor.forClass(String.class); 39 ArgumentCaptor<String> clientSecret = ArgumentCaptor.forClass(String.class); 40 41 Keycloak.getInstance(serverUrl.capture(), realm.capture(), username.capture(), password.capture(), clientId.capture(), clientSecret.capture()); 42 43 // これは通ります 44 assertThat(System.getenv().get(SSOConstants.KEY_SERVER_URL), is(SERVER_URL)); 45 46 assertThat(serverUrl.getAllValues().get(0), is(SERVER_URL)); 47 assertThat(realm.getAllValues().get(0), is(REALM)); 48 assertThat(username.getAllValues().get(0), is(USERNAME)); 49 assertThat(password.getAllValues().get(0), is(PASSWORD)); 50 assertThat(clientId.getAllValues().get(0), is(CLIENT_ID)); 51 assertThat(clientSecret.getAllValues().get(0), is(CLIENT_SECRET)); 52 } 53}
assertThat(System.getenv().get(SSOConstants.KEY_SERVER_URL), is(SERVER_URL)); は通るにも関わらず、それ以降の System.getenv().get で Null が返ります。
java.lang.AssertionError: Expected: is "localhost" but: was null ``` 何か使い方を間違っていますでしょうか? ご教示いただけますと幸いです。
あなたの回答
tips
プレビュー