gpt4 book ai didi

java - 如何使用 Mockito 测试 api?我们需要模拟所有的类变量吗?

转载 作者:行者123 更新时间:2023-11-28 21:29:47 30 4
gpt4 key购买 nike

我想测试一个使用如此多类变量的 API,并且在方法中还有如此多的其他方法调用,我不知道如何模拟它们,或者我是否需要一种不同的方法。

请帮我解决这个问题,我提供以下代码:

public class LoginController implements Initializable

{

protected static BorderPane choose;

protected static VBox menu;

@FXML
private BorderPane loginPane;

@FXML
private Label errorText;

@FXML
private PasswordField password;

@FXML
private Label databaseName;

@FXML
private Label host;

@FXML
private Button login;

@FXML
private TextField userId;

BaseFrame mainController = BaseFrame.getMainController();

@Override
public void initialize(URL arg0, ResourceBundle arg1)
{
assert login != null : "fx:id=\"login\" was not injected: check your FXML file 'Login.fxml'.";
OSSDatabase ossDatabase = (OSSDatabase) OSSConfigurationTool.getContext().getBean("ossDatabase");
this.databaseName.setText(ossDatabase.getName());
this.host.setText(ossDatabase.getHost());
login.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
String username = userId.getText().trim();
String credentials = password.getText().trim();
if (isValid(username) && isValid(credentials))
{
errorText.setText("");
UserManager userManager = (UserManager) OSSConfigurationTool.getContext().getBean("UserManager");
try
{
userManager.login(username, credentials, true);
FXMLLoader menuLoader = new FXMLLoader(LoginController.class.getResource("/com/capsilon/oss/configuration/tool/view/mainMenu.fxml"));
try
{
mainController.getMenuPane().setVisible(true);
mainController.getMenuPane().add((VBox) menuLoader.load(), 0, 1);
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (OSSException e)
{
e.printStackTrace();
errorText.setText(e.getErrorCode().name());
errorText.setTooltip(new Tooltip(e.getMessage()));
}
}
else
{
errorText.setText("Username or Password is empty");
}
}
});
}

在为此方法创建测试时,我编写了以下测试方法,该方法最初给出 NPE 并且不会进一步进行。

public class LoginControllerTest 
{
@Mock
OSSDatabase ossDatabase;
@Mock
private TextField userId;
@Mock
private PasswordField password;

LoginController controller = new LoginController();

@Before
public void setUp() throws Exception
{
}

@Test
public final void testInitialize()
{
URL url = PowerMockito.mock(URL.class);
ResourceBundle bundle = Mockito.mock(ResourceBundle.class);

Mockito.when((OSSDatabase) OSSConfigurationTool.getContext().getBean("ossDatabase")).thenReturn(ossDatabase);
Mockito.when(ossDatabase.getName()).thenReturn("SomeName");
Mockito.when(ossDatabase.getHost()).thenReturn("SomeHost");
Mockito.when(userId.getText().trim()).thenReturn("userName");

controller.initialize(url, bundle);
}

虽然我已经对一些方法调用进行了 stub,但仍然不知道这是否是正确的方法。请帮我。提前致谢。

最佳答案

你不说你的NPE在哪里...

我想是在这里:

((OSSDatabase) OSSConfigurationTool.getContext()

当你得到上下文时没有?

如果是,则必须模拟 OSSConfigurationTool.getContext() 以返回上下文 ;)

如果 OSSConfigurationTool 是您必须使用的静态调用(在 junit > 4 中)

@RunWith(PowerMockRunner.class)
@PrepareForTest( OSSConfigurationTool.class )
public class LoginControllerTest {
...

如果需要也添加这一行

PowerMockito.mockStatic(OSSConfigurationTool.class);

尝试所有这些,让我知道它是否有效

谢谢

关于java - 如何使用 Mockito 测试 api?我们需要模拟所有的类变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843079/

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