簡體   English   中英

如何覆蓋使用JUnit模擬調用靜態方法的方法?

[英]How to cover a method calling a static method using JUnit mocking?

考慮兩個類AB

class A {  static int a(){} }

class B {  void something(){ int value=A.a(); .......}}

現在,我必須使用Junit Test用例覆蓋B類,因此我創建了一個新類( TestB類)來覆蓋B類。

class TestB {  @Test  public void testsomething(){...} }

在這里,我的問題是,是否有任何方法可以覆蓋Aa()因為這是靜態方法。 我知道我不容易模擬它,因為其中沒有對象。 那么我將如何進行? 我正在使用JUnit和EasyMock。

您將不得不使用PowerMock和easymock來模擬靜態方法。

https://github.com/jayway/powermock/wiki/MockStatic

對於您的測試用例,模擬代碼將如下所示

KeyStore aMock = PowerMockito.mock(A.class);
PowerMockito.when(A.a()).thenReturn(0);

這是一個模擬KeyStore.getInstance方法的靜態方法的工作示例

KeyStoreService:

package com.foo;

import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;


public class KeyStoreService {

    public KeyStoreService(){

    }

    public void load() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
        System.out.println("start");
        KeyStore ks = KeyStore.getInstance("");
        ks.load(null, null);
        System.out.println("end");
    }

}

測試類別:

package com.foo.test;

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.cert.CertificateException;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import com.foo.KeyStoreService;

@PrepareForTest(KeyStoreService.class)
@RunWith(PowerMockRunner.class)
public class TestKeyStore {

    @Test
    public void test1() throws KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException, CertificateException, IOException{
        PowerMockito.mockStatic(KeyStore.class);
        KeyStore keyStoreMock = PowerMockito.mock(KeyStore.class);
        KeyStoreService kss = new KeyStoreService();
        PowerMockito.when(KeyStore.getInstance(Matchers.anyString(), Matchers.anyString())).thenReturn(keyStoreMock);
        Mockito.doNothing().when(keyStoreMock).load(Mockito.any(InputStream.class), Mockito.any(char[].class));
        kss.load();
    }
}

正如您指出的那樣,沒有辦法用easymock模擬靜態方法。

方法1:盡可能不要使用靜態方法。

方法2:在easymock頂部使用PowerMock。

方法3:通過在a()內使用供應商來委托Aa()的主體。 然后,您可以將“簡單”供應商用於測試用例,而將現實世界供應商用於生產用途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM