1

次のように、Mockito を使用して JUnit テスト クラスのクラスをモックしています。

@Before
public void initialize(){
    DescribeHiveTable mockObj = Mockito.mock(DescribeHiveTable.class);
    String tableName = "clslog_assessments";
    String parentDirectoryPath ="src/test/resources/TEST18/RunFiles";
    String[] mockFeaturesArray1 = {"user_id","event_id"};
    ArrayList<String> mockFeaturesList1 = new ArrayList<String> (Arrays.asList(mockFeaturesArray1));
    when(mockObj.describeTable(tableName, parentDirectoryPath)).thenReturn(mockFeaturesList1);

次に、内部からメソッドを呼び出す Test メソッドがありdescribeTableます。引数:tableNameparentDirectoryPathwhendescribeTableが呼び出されていることを確認しましたが、initialize メソッドで定義したものと同じです。

ただし、まだ null の戻り値が返されます。この振る舞いがわかりません。多分私はMockitoを正しく使用していませんか?

編集

私のテスト方法は次のようなものです:

@Test
public void testComplexFeaturesExistingRun() {
String[] args = {masterConfigPath, runFilesPath, rootDir};
DriverClass driver = new DriverClass();
driver.main(args);
}

したがって、driver.main は describeTable メソッドを呼び出します。その動作は、私がモックしようとしています。

編集2

私の記述ハイブテーブルクラスは次のとおりです。

public class DescribeHiveTable {

public ArrayList<String> describeTable(String tableName, String parentDirectoryPath){
    String hiveQuery = "'describe " + tableName + "';";
    String bashScriptFile = parentDirectoryPath + "/describeTable.sh";

    .
    .
    .
        final Process process = builder.start();
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while((line=br.readLine())!=null) {
            String[] output = line.split("\t");
            columnList.add(output[0]);
       }
       return columnList;

これは私がdescribe tableを呼び出す方法です:

DescribeHiveTable describeTable;
describeTable = new DescribeHiveTable();
ArrayList<String> columnList = describeTable.describeTable(tableName, runFile.getParent());
4

2 に答える 2

2

Mockitoの使い方は

private DescribeHiveTable mockObj; // must be accessible to Test methods

@Before
public void initialize(){
    this.mockObj = Mockito.mock(DescribeHiveTable.class);
    <etc>
}

@Test
public void testComplexFeaturesExistingRun() {
    /* test the objects that are set up to use this.mockObj,
       and not the usual type of DescribeHiveTable */
}

ご了承ください

describeTable = new DescribeHiveTable();

DescribeHiveTableモックされたではなく、新しいモックされていない を使用していることを意味しますmockObj

しかし、 ?DescribeHiveTableによって使用されるインスタンスを制御できないようです。DriverClassそうなったらどちらか

  • Mockito は役に立ちません。少なくとも、Mockito もモックする必要がありDriverClassます。また
  • describeTableinDriverClassをに置き換えるには、リフレクションを使用する必要がありますmockObj
于 2013-09-21T04:03:45.637 に答える
1

DriverClass以下のように、 のモックを使用してを初期化できますDescribeHiveTable(提供されるDescribeHiveTableは のインスタンス変数ですDriverClass)。

public class TestClass{

@Mock
DescribeHiveTable mockObj;
// This will create a new instance of DriverClass with a mock of DescribeHiveTable
@InjectMocks
DriverClass driver;

@Before
    public void init() {

        MockitoAnnotations.initMocks(this);

        tableName = "clslog_assessments";
        parentDirectoryPath = "src/test/resources/TEST18/RunFiles";
        mockFeaturesArray1 = new String[] { "user_id", "event_id" };
        mockFeaturesList1 = new ArrayList<String>(
                Arrays.asList(mockFeaturesArray1));
        when(mockObj.describeTable(tableName, parentDirectoryPath)).thenReturn(
                mockFeaturesList1);
}

@Test
public void test() {
    // when(methodCall)
    assertEquals(mockFeaturesList1, driver.main());
}

}
于 2013-09-21T05:06:50.843 に答える