小编gri*_*gon的帖子

如何在Mockito中匹配可能的null参数

我正在尝试验证我正在测试的类调用正确的依赖类的方法.所以我试图匹配方法参数,但我并不真正关心这个测试中的实际值,因为我不想让我的测试变脆.

但是,我遇到了麻烦,因为Mockito决定我期待的行为是一个错误:https://github.com/mockito/mockito/issues/134

那么为可能为null的参数定义匹配器的正确方法是什么?

问题#134"已修复",此代码失败,因为匹配器仅在第一种情况下匹配.如何在所有4种情况下定义匹配器?

MyClass c = mock(MyClass.class);

c.foo("hello", "world");
c.foo("hello", null);
c.foo(null, "world");
c.foo(null, null);

verify(c, times(4)).foo(anyString(), anyString());
Run Code Online (Sandbox Code Playgroud)

mockito

19
推荐指数
1
解决办法
2万
查看次数

ThymeLeaf Fragment在假的情况下执行:if

我正在使用Thymeleaf与Spring-Boot一起打包.这是主要模板:

<div class="container">
    <table th:replace="fragments/resultTable" th:if="${results}">
        <tr>
            <th>Talent</th>
            <th>Score</th>
        </tr>
        <tr>
            <td>Confidence</td>
            <td>1.0</td>
        </tr>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

它使用这个片段:

<table th:fragment="resultTable">
    <tr>
        <th>Talent</th>
        <th>Score</th>
    </tr>
    <tr th:each="talent : ${talents}">
        <td th:text="${talent}">Talent</td>
        <td th:text="${results.getScore(talent)}">1.0</td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

只有存在结果对象时,该片段才有效.这对我来说很有意义.因此,基于文档中的语法,我将th:if语句添加到主模板文件中.但是,当我在没有对象的情况下访问模板时,我仍然会收到此错误

Attempted to call method getScore(com.model.Talent) on null context object
Run Code Online (Sandbox Code Playgroud)

th:if语句是否应该阻止访问该代码?

填充结果对象时模板仍然可以正常工作,但是如何在没有表的情况下渲染null case?

spring-mvc thymeleaf spring-boot

8
推荐指数
2
解决办法
3553
查看次数

异常丰富是一种可行的模式吗?

我最近看到 Jakob Jenkov 写的一篇关于丰富异常的文章。我真的很喜欢这个主意!

我已经成为一名 Java 开发人员 4 年了,但我仍然对试图弄清楚如何处理第三方库抛出的所有 SQLExcepions、IOException 和随机异常感到非常恼火。我最终花了很多心思思考何时合适重新抛出异常,或者将其包装为自定义异常,但如果我编写自定义异常,那么我应该放置它吗?与我正在编写的类在同一个包中,还是在中央“例外”包中?我什至尝试过将自定义异常声明为内部类,因为它们通常看起来非常一次性。

无论如何,Jenkov 的想法概述如下: http: //tutorials.jenkov.com/java-exception-handling/exception-enrichment.html

正如他所概述的那样,使用一个可丰富的例外似乎对我来说非常有吸引力,因为它似乎可以轻松地回避我的大部分挫败感。但我认为我从未见过它在我使用过的任何库中使用过。这是有原因的吗?我所遗漏的这种方法是否存在重大缺陷?

简单总结:

public class AppException extends Exception{
    public AppException(String errCode, String context, String userMessage, Throwable t){}

    public AppException(String, errCode, String context, String userMessage) {}

    public void addInfo(String errCode, String context, String userMessage){}
}

public class MyApp {
    public static void main(String [] args) {
        MyApp app = new MyApp();

            app.start(args[0], args[1]);        
    }

    public void start(String username, String password) {
        try {
            User user = loginController.login(username, …
Run Code Online (Sandbox Code Playgroud)

java error-handling

7
推荐指数
0
解决办法
736
查看次数

Java 8 Streams中产生副作用的危险是什么?

我试图理解在“流文档”中发现的警告。我已经习惯了使用forEach()作为通用迭代器。这导致我编写这种类型的代码:

public class FooCache {
    private static Map<Integer, Integer> sortOrderCache = new ConcurrentHashMap<>();
    private static Map<Integer, String> codeNameCache = new ConcurrentHashMap<>();

    public static void populateCache() {
        List<Foo> myThings = getThings();

        myThings.forEach(thing -> {
            sortOrderCache.put(thing.getId(), thing.getSortOrder());
            codeNameCache.put(thing.getId(), thing.getCodeName())
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子。我了解该代码违反了Oracle关于有状态lamda和副作用的警告。但是我不明白为什么这个警告存在。

运行此代码时,它似乎表现出预期的效果。那么,我如何打破这一点来说明为什么这是一个坏主意?

在某种程度上,我读到以下内容:

如果并行执行,则ArrayList的非线程安全性将导致错误的结果,而添加所需的同步将导致争用,从而削弱了并行性的优势。

但是,谁能增加清晰度以帮助我理解警告?

java java-stream

7
推荐指数
1
解决办法
2771
查看次数

运行Maven部署而无需重新运行整个构建

我正在为Maven项目开发多分支管道。我正在尝试遵循Jenkins文档所引用的标准CI步骤,即构建,测试和部署。但是,maven在将这些步骤视为谨慎的步骤时似乎并不很好。

到目前为止,我有:

stages {
    stage('Test') {
        steps {
            sh "mvn -B clean verify"
        }
    }
    stage('Deploy') {
        when {
            branch 'master'
        }
        steps {
            sh "mvn -B deploy"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,完整版本将运行两次,一次在Test阶段中,一次在Deploy阶段中。不好意思,这要感谢Google Web Toolkit,因为它很耗时,但是这是一个单独的问题。

有没有一种方法可以优雅地跳过Deploy阶段中较早的Maven生命周期步骤并跳至部署目标?

我能想到的唯一其他选择是

stages {
    stage('Test') {
        when {
            // Some expression that states "not master"
        }
        steps {
            sh "mvn -B clean verify"
        }
    }
    stage('Test-and-Deploy') {
        when {
            branch 'master'
        }
        steps {
            sh "mvn -B deploy"
        }
    } …
Run Code Online (Sandbox Code Playgroud)

maven jenkins jenkins-pipeline

6
推荐指数
1
解决办法
1099
查看次数

如何合并maven设置文件

我已被添加到另一个工作团队。两个团队都使用自己的 Nexus 服务器,并为我提供了自己的设置文件,因此目前我必须做大量的工作来确保我使用正确的 settings.xml 文件来构建项目。有没有好的方法来合并这些文件?我一直在浏览 Maven 文档,但感到非常困惑。设置文件如下(已删除识别信息)

团队 1 设置文件

<settings>
 <mirrors>
   <mirror>
    <id>Nexus</id>
    <name>Company Nexus Public Mirror</name>
    <url>http://build.company.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
   </mirror>
  </mirrors>
 <servers>
   <server>
    <id>snapshots</id>
    <username>deployment</username>
    <password>password1</password>
   </server>
   <server>
    <id>releases</id>
    <username>deployment</username>
    <password>password2</password>
   </server>
  </servers>
 <activeProfiles>
   <activeProfile>jenkins</activeProfile>
  </activeProfiles>
</settings>
Run Code Online (Sandbox Code Playgroud)

团队 2 设置文件

<settings>
    <mirrors>
        <mirror>
            <!--This sends everything else to /public -->
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>http://domain.company.com:8081/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>nexus</id>
            <!--Enable snapshots for the built in central repo to direct -->
            <!--all requests to nexus via the mirror -->
            <repositories>
                <repository> …
Run Code Online (Sandbox Code Playgroud)

nexus maven-3 maven

5
推荐指数
1
解决办法
2780
查看次数

Observable&lt;void&gt; 不调用订阅者

我正在努力围绕 Observable 进行单元测试,使其按照我期望的方式运行。我使用 Observable 本质上只是为了通知进程已完成。注销函数中还没有异步代码,但是当我实现所有逻辑时就会有。我不需要可观察者返回任何数据,我只是希望它调用订阅者作为注销完成的信号。

\n\n

问题是我的单元测试显示订阅者从未被实际调用。我通常使用 async/await 进行工作,具有讽刺意味的是,Observables 往往会因为做这样的事情而让我头疼,但我正在努力在前端变得更好,而前端似乎更喜欢 Observables。

\n\n

这是我正在搭建的一个新的 Angular 9 应用程序。单元测试在 Jest 中运行,我通过 Wallaby 运行它们。

\n\n

这是我的故障排除:

\n\n

我故意破坏了该功能来验证我的单元测试是否有效。

\n\n

测试不调用断言

\n\n

我的测试第 63 行上的灰色框是 Wallaby,表明测试从未执行过该行。所以测试自然会通过,因为断言从未被检查过。

\n\n

如果我更改可观察对象以返回一个值,我至少会得到要执行的行......有点。

\n\n

已调用断言,但出现不正确的错误。

\n\n

但我没有从我的模拟中收到预期的失败消息。它应该报告“预期clearSession()被调用1次,为0”

\n\n

所以我运行 Jest 只是为了看看发生了什么,我得到:

\n\n
FAIL  src/app/auth/auth.service.spec.ts\n\xe2\x97\x8f AuthService \xe2\x80\xba logout \xe2\x80\xba should destroy the session\n\n1 timer(s) still in the queue.\n\n  at node_modules/zone.js/dist/fake-async-test.js:621:31\n  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:386:30)\n  at ProxyZoneSpec.Object.<anonymous>.ProxyZoneSpec.onInvoke (node_modules/zone.js/dist/proxy.js:117:43)\n  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:385:36)\n  at Zone.Object.<anonymous>.Zone.run (node_modules/zone.js/dist/zone.js:143:47)\n
Run Code Online (Sandbox Code Playgroud)\n\n

让事情变得很奇怪......如果我修复这个功能,一切都会很高兴!但只要 Observable 返回一个值,即使我只是使用 Observable 来通知进程何时完成。但我无法让我的实际断言失败,它失败是因为一些看似无关的事情(队列中的计时器?无论这意味着什么)。

\n\n

测试通过并执行断言

\n\n

verify函数源自该函数 …

javascript unit-testing observable typescript angular

5
推荐指数
1
解决办法
3259
查看次数

为什么 /user/local/go 在 GoLand 中不被识别为 Go SDK

我正在尝试设置 GoLand 以使用 WSL 2,如本指南中所示:https://www.jetbrains.com/help/go/how-to-use-wsl-development-environment-in-product.html

我已经按照 GoLang 网站上的 linux 说明在 Ubuntu 发行版中安装了 Go,并go version打印出了我下载的版本,因此看起来 Go 正在 WSL 中运行。

打印Go版本

所以现在我尝试在 GoLand 中创建一个新项目,但出现错误,这似乎是由于 GoLand 中未加载 SDK。该指南对此没有提供太多指导,因此我只是尝试添加本地 SDK。

当我选择时/usr/local/go,我收到一条错误消息,指出它不是有效的 SDK。 无效的 sdk 目录错误

因此,我创建了该~/go目录,然后更新了我的.zshrc文件以导出GOPATHGOROOT环境变量,即使它们在我运行时已经出现go env,这样做可以让它们在一个简单的调用中出现env

但我仍然收到如上所述的无效 SDK 错误。

我是否遗漏了指南中未详细说明的配置步骤?我遇到了这篇关于创建符号链接来伪造预期目录结构的旧帖子。我还没有这样做,因为这是一篇非常旧的帖子,有评论说这个问题已经被修复,而且看起来是一个非常奇怪的解决方案。

go goland wsl-2

5
推荐指数
1
解决办法
4153
查看次数

如何从材质图标按钮中删除边框和背景

我正在建立一个新项目。我已经通过 NPM 安装了 Angular 和 Material。然后我从此页面设置一个工具栏: https: //material.angular.io/components/toolbar/overview

我复制/粘贴了示例工具栏之一:

navbar.component.html

  <mat-toolbar color="primary">
    <button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">
      <mat-icon>menu</mat-icon>
    </button>
    <span>My App</span>
    <span class="example-spacer"></span>
    <button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">
      <mat-icon>favorite</mat-icon>
    </button>
    <button mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">
      <mat-icon>share</mat-icon>
    </button>
  </mat-toolbar>
Run Code Online (Sandbox Code Playgroud)

布局整体看起来不错。但图标按钮上有边框。

带边框的图标

它们似乎来自默认的 chrome 样式表。在开发工具中,它们具有继承自的边框和颜色属性user agent stylesheet

    background-color: -internal-light-dark(rgb(239, 239, 239), rgb(59, 59, 59));
    border-width: 2px;
    border-style: outset;
    border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133));
    border-image: initial;
Run Code Online (Sandbox Code Playgroud)

我尝试安装,normalize.css认为只需要设置浏览器默认值。但这对此没有任何影响。

文档说这mat-icon-button …

angular-material angular

4
推荐指数
1
解决办法
3613
查看次数

范围键未知时如何查询 DynamoDB

我有一个包含以下 KeySchema 的表:

KeySchema: [
{AttributeName: USER_ID,KeyType: HASH}, 
{AttributeName: COMPLETED,KeyType: RANGE}],
Run Code Online (Sandbox Code Playgroud)

用户 ID 只是一个整数,但COMPLETED它是创建记录时的时间戳。

我正在尝试使用以下代码检索记录:

Item item = tbl.getItem("USER_ID", "4216634082");
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

AmazonDynamoDBException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException...
Run Code Online (Sandbox Code Playgroud)

由于范围键是一个时间戳,所以在我找到记录之前我不知道它是什么。我如何实现这一目标?

amazon-web-services amazon-dynamodb aws-sdk

3
推荐指数
1
解决办法
5331
查看次数