我正在使用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手动构造然后执行惰性块 - …
我有一个 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) 在我的 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 …
我目前正在学习C#,我的情况是我有一个包含ISet的类.我不希望客户端直接修改这个集合,大多数客户端只添加和删除,我通过我的类提供访问器来执行此操作.
但是,我有一个客户希望了解有关此集及其内容的更多信息.我真的不想用这个客户端的许多方法来破坏包装类本身,所以我更希望能够以不可变的方式返回集合本身.
我发现我不能 - 嗯,不是真的.我似乎唯一的选择是:
我错过了什么吗?我不合理吗?我唯一的选择是在我的包装器上提供全套访问器吗?我的原始意图是不正确的,以保持绝大多数客户的包装干净?
所以有两个问题:
为什么没有标准的C#immutable Collection接口?这似乎是一个相当合理的要求?
为什么ReadOnlyCollection在它真的是ReadOnlyList时会恼人地调用ReadOnlyCollection?我要咬紧牙关并使用它直到我发现它是一个List(并且我使用Set).