当前位置: 首页 > 知识库问答 >
问题:

将可调用的as参数传递给方法,并将其返回值用作该方法的参数

乐正明辉
2023-03-14

我编写了一个方法,它接收一个可调用的字符串和一个任意长度的字符串数组,我使用这些字符串来确定可调用的执行时间,然后将结果写入数据库:

public static <T> T logTimes(Callable<T> callable, String actionToTest, String... testData) throws Exception {
        LocalDateTime before = null;
        T call = null;
        try {
            before = LocalDateTime.now();
            call = callable.call();
            logToDocument(before, LocalDateTime.now(), actionToTest, testData);
        } catch (TimeoutException ex) {
            logToDocument(before, LocalDateTime.now(), actionToTest, testData);
        }
        return call;
    }

这很好,但是我现在遇到了一种情况,我需要将Callable的返回值作为参数传递给相同的方法:

public static String loadedPageName(WebDriver driver, int seconds) throws Exception {
        String originPage = pageName(driver);
        By loadingBar = By.xpath("//div[contains(@class, 'progress')]");
        WebDriverWait w = new WebDriverWait(driver, seconds);
        Function<WebDriver, Boolean> pageFinishedLoading = wd -> wd.findElements(loadingBar).size() == 0;
        AtomicReference<String> dest = new AtomicReference<>();
        try {
            return ExtentTestManager.logTimes(()-> {
                w.until(ExpectedConditions.presenceOfAllElementsLocatedBy(loadingBar));
                w.until(pageFinishedLoading);
                dest.set(driver.findElement(By.tagName("body")).getAttribute("page-name"));
                return dest;
            }, REDIRECT, ORIGIN, originPage, DESTINATION, dest.get()).get();
        } catch (TimeoutException ex) {
            ExtentTestManager.reporterLog("Timeout after waiting ".concat(String.valueOf(seconds)).concat(" seconds for a page to load"));
            ExtentTestManager.logToDocument(LocalDateTime.now(), seconds, REDIRECT, ORIGIN, originPage, DESTINATION, "timeout");
            return null;
        }
    }

此方法一直等待,直到加载页并返回加载页的名称。我希望在ExtentTestManager.logtimes(callable callable,String actionToTest,String...testData) 调用中使用该返回值作为参数,而callable callable 是其参数之一。

现在,loadedPagename(WebDriver driver,int seconds)按预期返回页名,但logtimesnull写入数据库,以获得callable的结果。

有没有办法做到这一点?

共有1个答案

索令
2023-03-14

您在日志中的代码等效于:

    try {
        before = LocalDateTime.now();
        call = callable.call();
        
    } catch (TimeoutException ex) {
        // do nothing with the exception
    }
    logToDocument(before, LocalDateTime.now(), actionToTest, testData);

也许您想用TimeoutException做点什么?另外,loadedPageName中的调用代码将永远不会遇到TimeoutException,因为它已经在日志中被捕获(并被忽略)。

Edit:您声明“logtimes将null写入数据库,以获得可调用的结果。”我不明白,logTimes不是在任何地方写可调用的结果,而是只返回它。

AtomicReference<String> dest = new AtomicReference<>();
    try {
        return ExtentTestManager.logTimes(()-> {
            w.until(ExpectedConditions.presenceOfAllElementsLocatedBy(loadingBar));
            w.until(pageFinishedLoading);
            dest.set(driver.findElement(By.tagName("body")).getAttribute("page-name"));
            return dest.get();
        }, REDIRECT, ORIGIN, originPage, DESTINATION, dest.get());
public static <T> T logTimes(Callable<T> callable, String actionToTest, String... testData) throws Exception {
    LocalDateTime before = LocalDateTime.now();
    T call = callable.call();
    List<String> allTestData = new ArrayList<String>(Arrays.asList(testData));
    allTestData.add(String.valueOf(call));
    logToDocument(before, LocalDateTime.now(), actionToTest, allTestData.toArray(new String[0]));        
    return call;
}
 类似资料:
  • 我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?

  • 本文向大家介绍shell传参并将参数传递给sql文件的方法,包括了shell传参并将参数传递给sql文件的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 调用代码:   sh /tmp/t.sh 20160808  以上这篇shell传参并将参数传递给sql文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 我有一个用例,其中一个类存在于一个包的两个版本中。 到目前为止还不错(我相信)。 然后我有一个使用该类的应用程序,为了避免为不同的包版本重写应用程序,我想传递应该使用的类(即感兴趣的包)作为应用程序的参数。所以像这样的东西 我相信我可以把这个叫做如果我在构造函数中传递的实例,那么我会通过实例对象调用静态方法,不是吗? 另一方面,在上面的示例中,是一个类对象,因此我不能像上面那样调用静态方法。 这是

  • 我有办法 我想知道如果它真的创建了用户,我是否可以对其进行单元测试。但是它没有参数。 我尝试了以下方法: 然而,这实际上让我通过了与扫描仪的争论,这显然是我在测试中无法做到的。还尝试了其他逻辑。我也尝试过使用when(),,,但我找不到解决这个问题的方法,因为我对模仿还比较陌生。 有人能和我分享一些想法吗?

  • 我正在编写一个方法,如果我想将一个类传递给一个方法,其中代码的一部分包括检查对象是否属于某种类型。这就是我想要的(但显然不行): 关于如何做到这一点有什么提示吗?谢谢!