小编Jum*_*wah的帖子

使用Mockito和InjectMocks时未执行Kotlin延迟块

我正在使用Mockito来测试我的Kotlin代码.它是一个Web应用程序,我使用spring将值注入某些字段.

例如,我的类片段看起来像这样:

class MyComponent {

    @Inject private lateinit var request: HttpServletRequest
    @Inject private lateinit var database: Database
Run Code Online (Sandbox Code Playgroud)

为了在我的单元测试中模仿这一点,我使用了Mockito的注释@Mock@InjectMocks注释.所以我的测试看起来像这样:

class MyComponentTest {

    @Mock private lateinit var request: HttpServletRequest
    @Mock private lateinit var database: Database

    @InjectMocks private lateinit var sut: MyComponent

    @Before
    fun setup() {
       MockitoAnnotations.initMocks(this)
    }
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,我的组件中也有一个惰性初始化块,如下所示:

val user: User by lazy {
    database.findUser()
}

fun getUsername(): String {
    return user.name
}
Run Code Online (Sandbox Code Playgroud)

当我的测试调用时,myComponent.getUsername()我希望database.findUser()在初始化时调用,user但这不会发生.

如果我在懒惰的区域中放置一个断点,它就永远不会被击中.现在我假设这与Mockito的方式有关,@InjectMocks必须"触摸",user但我真的不知道.如果我MyComponent手动构造然后执行惰性块 - …

mockito kotlin

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

如何在CloudBuild中比较Git分支?

我有一个 CloudBuild 触发器设置来监听 bitbucket 存储库。构建完成后,我有一个云函数,它会向提交的作者发送一条松弛消息。

我遇到的问题是 bitbucket 触发repo:push分支创建(通过他们的 UI)。这会触发构建,然后通知源分支的最后一次提交的作者新的构建已准备就绪。

为了防止这种情况,我决定如果触发分支上的最后一次提交也在 master(源分支)上,则防止触发松弛消息。我已经尝试了多种方法,但触发时使用的 CloudBuild 克隆似乎不是完整克隆。我不太清楚本地存储库处于什么状态...看起来 CloudBuild 可能会master在本地调用分支,无论哪个分支触发了构建?例如,这样的命令:

- name: 'gcr.io/cloud-builders/git'
  entrypoint: /bin/bash
  args:
  - -c
  - |
    # Write the author name to the cloud build output
    git show -s --format='%ae' $COMMIT_SHA >> /builder/outputs/output
    # Write the latest commit to the output. 
    git rev-list ^master $COMMIT_SHA -1 >> /builder/outputs/output
Run Code Online (Sandbox Code Playgroud)

即使存在mybranch无法访问的更改,也会提供空白输出master。以下类似命令具有相同的结果:

git log master..$COMMIT_SHA --oneline -1 >> /builder/outputs/output
Run Code Online (Sandbox Code Playgroud)

当我在本地运行时,这两个命令都正确返回分支提交。

如果我添加一些像这样的显式结账步骤(在 rev-list 之前):

git checkout origin …
Run Code Online (Sandbox Code Playgroud)

git bitbucket google-cloud-platform google-cloud-build

5
推荐指数
0
解决办法
2053
查看次数

子项目中未解决的对包的依赖

在我的 Kotlin spring boot 项目中,我使用的是 Kotlin DSL Gradle,包含三个子项目。其中两个security取决于database.

在 IntelliJ 中,应用程序成功运行并按预期执行(当作为 Spring Boot 应用程序运行配置运行时)。

但是,当我尝试使用 Gradle 构建项目时,./gradlew clean build我得到了

e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (3, 26): Unresolved reference: database
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (19, 24): Unresolved reference: UsersRepository
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (36, 48): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (38, 42): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (38, 75): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (40, 63): Unresolved reference: it
> Task :security:compileKotlin FAILED
Run Code Online (Sandbox Code Playgroud)

它抱怨的实际线路是:

import com.path.database.repositories.UsersRepository
Run Code Online (Sandbox Code Playgroud)

it错误是从回购值。本UserRepository类是模块中database …

intellij-idea kotlin gradle-kotlin-dsl

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

为什么C#中没有真正的不可变集合?

我目前正在学习C#,我的情况是我有一个包含ISet的类.我不希望客户端直接修改这个集合,大多数客户端只添加和删除,我通过我的类提供访问器来执行此操作.

但是,我有一个客户希望了解有关此集及其内容的更多信息.我真的不想用这个客户端的许多方法来破坏包装类本身,所以我更希望能够以不可变的方式返回集合本身.

我发现我不能 - 嗯,不是真的.我似乎唯一的选择是:

  1. 返回IEnumerable(No:限制功能);
  2. ReadOnlyCollection(不是:这是一个列表);
  3. 返回一个副本(No:Bad form IMHO,允许客户修改返回的集合,或许不知道它不会改变真实对象,加上它有性能开销);
  4. 实现我自己的ReadOnlySet(不:需要从ISet派生,因此意味着我需要实现mutators,可能会触发异常,我宁愿编译时错误 - 而不是运行时).

我错过了什么吗?我不合理吗?我唯一的选择是在我的包装器上提供全套访问器吗?我的原始意图是不正确的,以保持绝大多数客户的包装干净?

所以有两个问题:

  1. 为什么没有标准的C#immutable Collection接口?这似乎是一个相当合理的要求?

  2. 为什么ReadOnlyCollection在它真的是ReadOnlyList时会恼人地调用ReadOnlyCollection?我要咬紧牙关并使用它直到我发现它是一个List(并且我使用Set).

c# immutability

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