gpt4 book ai didi

java - Mockito 模拟类返回 Null

转载 作者:行者123 更新时间:2023-11-29 05:37:33 56 4
gpt4 key购买 nike

我正在使用 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);

然后我有我的测试方法,它随后从内部调用 describeTable 方法。我检查了调用 describeTable 时的参数:tableNameparentDirectoryPath 是否与我在 initalize 方法中定义的参数相同。

但是,我仍然得到一个空返回值。我不明白这种行为。也许我没有正确使用 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;

这就是我调用描述表的方式:

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

最佳答案

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

但看起来您无法控制 DriverClass 使用的 DescribeHiveTable 实例?如果是这样的话,那么要么

  • Mockito 不会帮助您——或者您至少也必须模拟 DriverClass;或
  • 您必须使用反射将 DriverClass 中的 describeTable 替换为 mockObj

关于java - Mockito 模拟类返回 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928153/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com