0

powermockを使用してLogger.getInstance()メソッドをモックします。これは、junitがクラスをリロードしないようであり、最初のテストテストクラスの後に間違ったロガーインスタンスがあるため、問題を引き起こします。

public class LoggedClass {
    public static Logger log = Logger.getInstance();
    ....
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({ LoggedClass.class, Logger.class })
public class SomeTests {
    private Logger log;
    @Before
    public void setUp() {
         PowerMockito.mockStatic(Logger.class);
         log = PowerMockito.mock(Logger.class);
         PowerMockito.when(Logger.getInstance()).thenReturn(log);

         PowerMockito.mockStatic(LoggedClass.class);
    }

    @Test
    public void firstTest() {
         assertTrue(LoggedClass.log == log);
    }

    @Test
    public void secondTest() { // fails
         assertTrue(LoggedClass.log == log);
    }
}

LoggedClassのログインスタンスが古くなっているため、テストは失敗します。明示的に新しいロガーインスタンスを挿入することもできますが、モックする必要のある静的変数がたくさんある場合は面倒です。

新しいテストを実行するたびにクラスをリロードするようにju​​nitを設定するにはどうすればよいですか?

4

1 に答える 1

2

2番目のテストが失敗する理由は、テストごとlogにメソッド内にの新しいインスタンスを作成しているが、の呼び出しが1回だけ行われているためです。で持っていることを行うことを検討してください。@BeforeLogger.getInstance()static@Before@BeforeClass

logテストごとにの新しいインスタンスを作成する理由はないようです。これはでありmock、したがってリセットすることができます。

于 2011-11-14T12:59:33.887 に答える